flexmls_api 0.3.2
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.
- data/Gemfile +20 -0
- data/Gemfile.lock +60 -0
- data/LICENSE +14 -0
- data/README.md +128 -0
- data/Rakefile +78 -0
- data/VERSION +1 -0
- data/lib/flexmls_api/authentication.rb +104 -0
- data/lib/flexmls_api/client.rb +20 -0
- data/lib/flexmls_api/configuration.rb +40 -0
- data/lib/flexmls_api/faraday.rb +52 -0
- data/lib/flexmls_api/models/base.rb +76 -0
- data/lib/flexmls_api/models/connect_prefs.rb +10 -0
- data/lib/flexmls_api/models/contact.rb +25 -0
- data/lib/flexmls_api/models/custom_fields.rb +12 -0
- data/lib/flexmls_api/models/document.rb +11 -0
- data/lib/flexmls_api/models/idx_link.rb +45 -0
- data/lib/flexmls_api/models/listing.rb +110 -0
- data/lib/flexmls_api/models/market_statistics.rb +33 -0
- data/lib/flexmls_api/models/photo.rb +15 -0
- data/lib/flexmls_api/models/property_types.rb +7 -0
- data/lib/flexmls_api/models/standard_fields.rb +7 -0
- data/lib/flexmls_api/models/subresource.rb +13 -0
- data/lib/flexmls_api/models/system_info.rb +7 -0
- data/lib/flexmls_api/models/video.rb +16 -0
- data/lib/flexmls_api/models/virtual_tour.rb +18 -0
- data/lib/flexmls_api/models.rb +21 -0
- data/lib/flexmls_api/paginate.rb +87 -0
- data/lib/flexmls_api/request.rb +172 -0
- data/lib/flexmls_api/version.rb +4 -0
- data/lib/flexmls_api.rb +41 -0
- data/spec/fixtures/contacts.json +25 -0
- data/spec/fixtures/listing_document_index.json +19 -0
- data/spec/fixtures/listing_no_subresources.json +38 -0
- data/spec/fixtures/listing_photos_index.json +469 -0
- data/spec/fixtures/listing_videos_index.json +18 -0
- data/spec/fixtures/listing_virtual_tours_index.json +42 -0
- data/spec/fixtures/listing_with_documents.json +52 -0
- data/spec/fixtures/listing_with_photos.json +110 -0
- data/spec/fixtures/listing_with_supplement.json +39 -0
- data/spec/fixtures/listing_with_videos.json +54 -0
- data/spec/fixtures/listing_with_vtour.json +48 -0
- data/spec/fixtures/session.json +10 -0
- data/spec/json_helper.rb +77 -0
- data/spec/spec_helper.rb +78 -0
- data/spec/unit/flexmls_api/configuration_spec.rb +97 -0
- data/spec/unit/flexmls_api/faraday_spec.rb +94 -0
- data/spec/unit/flexmls_api/models/base_spec.rb +62 -0
- data/spec/unit/flexmls_api/models/connect_prefs_spec.rb +9 -0
- data/spec/unit/flexmls_api/models/contact_spec.rb +70 -0
- data/spec/unit/flexmls_api/models/document_spec.rb +39 -0
- data/spec/unit/flexmls_api/models/listing_spec.rb +174 -0
- data/spec/unit/flexmls_api/models/photo_spec.rb +59 -0
- data/spec/unit/flexmls_api/models/property_types_spec.rb +20 -0
- data/spec/unit/flexmls_api/models/standard_fields_spec.rb +42 -0
- data/spec/unit/flexmls_api/models/system_info_spec.rb +37 -0
- data/spec/unit/flexmls_api/models/video_spec.rb +43 -0
- data/spec/unit/flexmls_api/models/virtual_tour_spec.rb +46 -0
- data/spec/unit/flexmls_api/paginate_spec.rb +221 -0
- data/spec/unit/flexmls_api/request_spec.rb +288 -0
- data/spec/unit/flexmls_api_spec.rb +44 -0
- metadata +315 -0
@@ -0,0 +1,288 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe FlexmlsApi do
|
4
|
+
describe FlexmlsApi::ClientError do
|
5
|
+
subject { FlexmlsApi::ClientError.new("1234", 200) }
|
6
|
+
it "should have an api code" do
|
7
|
+
subject.code.should == "1234"
|
8
|
+
end
|
9
|
+
it "should have an http status" do
|
10
|
+
subject.status.should == 200
|
11
|
+
end
|
12
|
+
it "should raise and exception with attached message" do
|
13
|
+
expect { raise subject, "My Message" }.to raise_error(FlexmlsApi::ClientError){ |e| e.message.should == "My Message" }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe FlexmlsApi::ApiResponse do
|
18
|
+
it "should asplode if given an invalid or empty response" do
|
19
|
+
expect { FlexmlsApi::ApiResponse.new("KABOOOM") }.to raise_error(FlexmlsApi::InvalidResponse)
|
20
|
+
expect { FlexmlsApi::ApiResponse.new({"D"=>{}}) }.to raise_error(FlexmlsApi::InvalidResponse)
|
21
|
+
end
|
22
|
+
it "should have results when successful" do
|
23
|
+
r = FlexmlsApi::ApiResponse.new({"D"=>{"Success" => true, "Results" => []}})
|
24
|
+
r.success?.should be true
|
25
|
+
r.results.empty?.should be true
|
26
|
+
end
|
27
|
+
it "should have a message on error" do
|
28
|
+
r = FlexmlsApi::ApiResponse.new({"D"=>{"Success" => false, "Message" => "I am a failure."}})
|
29
|
+
r.success?.should be false
|
30
|
+
r.message.should be == "I am a failure."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe FlexmlsApi::Request do
|
35
|
+
before(:all) do
|
36
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
37
|
+
stub.get('/v1/system?ApiSig=SignedToken&AuthToken=1234') { [200, {}, '{"D": {
|
38
|
+
"Success": true,
|
39
|
+
"Results": [{
|
40
|
+
"Name": "My User",
|
41
|
+
"OfficeId": "20070830184014994915000000",
|
42
|
+
"Configuration": [],
|
43
|
+
"Id": "20101202170654111629000000",
|
44
|
+
"MlsId": "20000426143505724628000000",
|
45
|
+
"Office": "test office",
|
46
|
+
"Mls": "flexmls Web Demonstration Database"
|
47
|
+
}]}
|
48
|
+
}']
|
49
|
+
}
|
50
|
+
stub.get('/v1/marketstatistics/price?ApiSig=SignedToken&AuthToken=1234&Options=ActiveAverageListPrice') { [200, {}, '{"D": {
|
51
|
+
"Success": true,
|
52
|
+
"Results": [{
|
53
|
+
"Dates": ["11/1/2010","10/1/2010","9/1/2010","8/1/2010","7/1/2010",
|
54
|
+
"6/1/2010","5/1/2010","4/1/2010","3/1/2010","2/1/2010",
|
55
|
+
"1/1/2010","12/1/2009"],
|
56
|
+
"ActiveAverageListPrice": [100000,100000,100000,100000,100000,100000,100000,100000,100000,100000,100000,100000]
|
57
|
+
}]}
|
58
|
+
}']
|
59
|
+
}
|
60
|
+
stub.post('/v1/contacts?ApiSig=SignedToken&AuthToken=1234', '{"D":{"Contacts":[{"DisplayName":"Wades Contact","PrimaryEmail":"wade11@fbsdata.com"}]}}') { [201, {}, '{"D": {
|
61
|
+
"Success": true,
|
62
|
+
"Results": [{"ResourceUri": "1000"}]}}']
|
63
|
+
}
|
64
|
+
stub.put('/v1/contacts/1000?ApiSig=SignedToken&AuthToken=1234', '{"D":{"Contacts":[{"DisplayName":"WLMCEWENS Contact","PrimaryEmail":"wlmcewen789@fbsdata.com"}]}}') { [200, {}, '{"D": {
|
65
|
+
"Success": true}}']
|
66
|
+
}
|
67
|
+
stub.delete('/v1/contacts/1000?ApiSig=SignedToken&AuthToken=1234') { [200, {}, '{"D": {
|
68
|
+
"Success": true}}']
|
69
|
+
}
|
70
|
+
# EXPIRED RESPONSES
|
71
|
+
stub.get('/v1/system?ApiSig=SignedToken&AuthToken=EXPIRED') { [401 , {}, '{"D": {
|
72
|
+
"Success": false,
|
73
|
+
"Message": "Session token has expired",
|
74
|
+
"Code": 1020
|
75
|
+
}}']
|
76
|
+
}
|
77
|
+
stub.post('/v1/contacts?ApiSig=SignedToken&AuthToken=EXPIRED', '{"D":{"Contacts":[{"DisplayName":"Wades Contact","PrimaryEmail":"wade11@fbsdata.com"}]}}') { [401 , {}, '{"D": {
|
78
|
+
"Success": false,
|
79
|
+
"Message": "Session token has expired",
|
80
|
+
"Code": 1020
|
81
|
+
}}']
|
82
|
+
}
|
83
|
+
# Test for really long float numbers
|
84
|
+
stub.get('/v1/listings/1000?ApiSig=SignedToken&AuthToken=1234') { [200, {}, '{"D": {
|
85
|
+
"Success": true,
|
86
|
+
"Results": [{
|
87
|
+
"ResourceUri":"/v1/listings/20101103161209156282000000",
|
88
|
+
"StandardFields":{
|
89
|
+
"BuildingAreaTotal":0.000000000000000000000000001,
|
90
|
+
"ListPrice":9999999999999999999999999.99
|
91
|
+
}
|
92
|
+
}]}
|
93
|
+
}']
|
94
|
+
}
|
95
|
+
end
|
96
|
+
@connection = test_connection(stubs)
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when successfully authenticated" do
|
100
|
+
subject do
|
101
|
+
class RequestTest
|
102
|
+
include FlexmlsApi::Request
|
103
|
+
def initialize(session)
|
104
|
+
@session = session
|
105
|
+
end
|
106
|
+
def authenticate()
|
107
|
+
raise "Should not be invoked #{@session.inspect}"
|
108
|
+
end
|
109
|
+
def sign_token(path, params = {}, post_data="")
|
110
|
+
"SignedToken"
|
111
|
+
end
|
112
|
+
def version()
|
113
|
+
"v1"
|
114
|
+
end
|
115
|
+
def empty_parameters()
|
116
|
+
build_url_parameters()
|
117
|
+
end
|
118
|
+
attr_accessor :connection
|
119
|
+
end
|
120
|
+
my_s = mock_session()
|
121
|
+
r = RequestTest.new(my_s)
|
122
|
+
r.connection = @connection
|
123
|
+
r
|
124
|
+
end
|
125
|
+
it "should give me empty string when no parameters" do
|
126
|
+
subject.empty_parameters().should == ""
|
127
|
+
end
|
128
|
+
it "should get a service" do
|
129
|
+
subject.get('/system')[0]["Name"].should == "My User"
|
130
|
+
end
|
131
|
+
it "should get a service with parameters" do
|
132
|
+
subject.get('/marketstatistics/price', "Options" => "ActiveAverageListPrice")[0]["ActiveAverageListPrice"].should == [100000,100000,100000,100000,100000,100000,100000,100000,100000,100000,100000,100000]
|
133
|
+
end
|
134
|
+
it "should post to a service" do
|
135
|
+
data = {"Contacts" => [{"DisplayName"=>"Wades Contact","PrimaryEmail"=>"wade11@fbsdata.com"}]}
|
136
|
+
subject.post('/contacts', data)[0]["ResourceUri"].should == "1000"
|
137
|
+
end
|
138
|
+
it "should put to a service" do
|
139
|
+
# This is a hypothetical unsupported service action at this time
|
140
|
+
data = {"Contacts" => [{"DisplayName"=>"WLMCEWENS Contact","PrimaryEmail"=>"wlmcewen789@fbsdata.com"}]}
|
141
|
+
subject.put('/contacts/1000', data).should be nil
|
142
|
+
# No validation here, if no error is raised, everything is hunky dory
|
143
|
+
end
|
144
|
+
it "should delete from a service" do
|
145
|
+
# This is a hypothetical unsupported service action at this time
|
146
|
+
subject.delete('/contacts/1000').should be nil
|
147
|
+
# No validation here, if no error is raised, everything is hunky dory
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should give me BigDecimal results for large floating point numbers" do
|
151
|
+
MultiJson.default_engine.should eq :yajl
|
152
|
+
result = subject.get('/listings/1000')[0]
|
153
|
+
result["StandardFields"]["BuildingAreaTotal"].class.should eq Float
|
154
|
+
pending("our JSON parser does not support large decimal types. Anyone feel like writing some c code?") do
|
155
|
+
result["StandardFields"]["BuildingAreaTotal"].class.should eq BigDecimal
|
156
|
+
number = BigDecimal.new(result["StandardFields"]["BuildingAreaTotal"].to_s)
|
157
|
+
number.to_s.should eq BigDecimal.new("0.000000000000000000000000001").to_s
|
158
|
+
number = BigDecimal.new(result["StandardFields"]["ListPrice"].to_s)
|
159
|
+
number.to_s.should eq BigDecimal.new("9999999999999999999999999.99").to_s
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when unauthenticated" do
|
166
|
+
subject do
|
167
|
+
class RequestAuthTest
|
168
|
+
include FlexmlsApi::Request
|
169
|
+
def authenticate()
|
170
|
+
@session ||= mock_session()
|
171
|
+
end
|
172
|
+
def sign_token(path, params = {}, post_data="")
|
173
|
+
"SignedToken"
|
174
|
+
end
|
175
|
+
def version()
|
176
|
+
"v1"
|
177
|
+
end
|
178
|
+
attr_accessor :connection
|
179
|
+
end
|
180
|
+
r = RequestAuthTest.new
|
181
|
+
r.connection = @connection
|
182
|
+
r
|
183
|
+
end
|
184
|
+
it "should authenticate and then get a service" do
|
185
|
+
subject.get('/system')[0]["Name"].should == "My User"
|
186
|
+
end
|
187
|
+
it "should authenticate and then post to a service" do
|
188
|
+
data = {"Contacts" => [{"DisplayName"=>"Wades Contact","PrimaryEmail"=>"wade11@fbsdata.com"}]}
|
189
|
+
subject.post('/contacts', data)[0]["ResourceUri"].should == "1000"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "when expired" do
|
194
|
+
subject do
|
195
|
+
class RequestExpiredTest
|
196
|
+
include FlexmlsApi::Request
|
197
|
+
def initialize(session)
|
198
|
+
@session = session
|
199
|
+
@reauthenticated = false
|
200
|
+
end
|
201
|
+
def authenticate()
|
202
|
+
@reauthenticated = true
|
203
|
+
@session = mock_session()
|
204
|
+
end
|
205
|
+
def sign_token(path, params = {}, post_data="")
|
206
|
+
"SignedToken"
|
207
|
+
end
|
208
|
+
def version()
|
209
|
+
"v1"
|
210
|
+
end
|
211
|
+
def reauthenticated?
|
212
|
+
@reauthenticated == true
|
213
|
+
end
|
214
|
+
attr_accessor :connection
|
215
|
+
end
|
216
|
+
r = RequestExpiredTest.new(mock_expired_session())
|
217
|
+
r.connection = @connection
|
218
|
+
r
|
219
|
+
end
|
220
|
+
it "should reauthenticate and then get a service" do
|
221
|
+
subject.get('/system')[0]["Name"].should == "My User"
|
222
|
+
subject.reauthenticated?.should == true
|
223
|
+
end
|
224
|
+
it "should reauthenticate and then post to a service" do
|
225
|
+
data = {"Contacts" => [{"DisplayName"=>"Wades Contact","PrimaryEmail"=>"wade11@fbsdata.com"}]}
|
226
|
+
subject.post('/contacts', data)[0]["ResourceUri"].should == "1000"
|
227
|
+
subject.reauthenticated?.should == true
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
context "when expire response" do
|
232
|
+
subject do
|
233
|
+
session = FlexmlsApi::Authentication::Session.new("AuthToken" => "EXPIRED", "Expires" => (Time.now + 60).to_s, "Roles" => "['idx']")
|
234
|
+
r = RequestExpiredTest.new(session)
|
235
|
+
r.connection = @connection
|
236
|
+
r
|
237
|
+
end
|
238
|
+
it "should reauthenticate and then get a service" do
|
239
|
+
subject.get('/system')[0]["Name"].should == "My User"
|
240
|
+
subject.reauthenticated?.should == true
|
241
|
+
end
|
242
|
+
it "should reauthenticate and then post to a service" do
|
243
|
+
data = {"Contacts" => [{"DisplayName"=>"Wades Contact","PrimaryEmail"=>"wade11@fbsdata.com"}]}
|
244
|
+
subject.post('/contacts', data)[0]["ResourceUri"].should == "1000"
|
245
|
+
subject.reauthenticated?.should == true
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
context "when the server is being a real jerk on expire response" do
|
250
|
+
subject do
|
251
|
+
class RequestAlwaysExpiredJerkTest
|
252
|
+
include FlexmlsApi::Request
|
253
|
+
def initialize()
|
254
|
+
@reauthenticated = 0
|
255
|
+
end
|
256
|
+
def authenticate()
|
257
|
+
@reauthenticated += 1
|
258
|
+
@session = session = FlexmlsApi::Authentication::Session.new("AuthToken" => "EXPIRED", "Expires" => (Time.now + 60).to_s, "Roles" => "['idx']")
|
259
|
+
end
|
260
|
+
def sign_token(path, params = {}, post_data="")
|
261
|
+
"SignedToken"
|
262
|
+
end
|
263
|
+
def version()
|
264
|
+
"v1"
|
265
|
+
end
|
266
|
+
def reauthenticated
|
267
|
+
@reauthenticated
|
268
|
+
end
|
269
|
+
attr_accessor :connection
|
270
|
+
end
|
271
|
+
r = RequestAlwaysExpiredJerkTest.new
|
272
|
+
r.connection = @connection
|
273
|
+
r
|
274
|
+
end
|
275
|
+
it "should fail horribly on a get" do
|
276
|
+
expect { subject.get('/system')}.to raise_error(FlexmlsApi::PermissionDenied){ |e| e.code.should == FlexmlsApi::ResponseCodes::SESSION_TOKEN_EXPIRED }
|
277
|
+
subject.reauthenticated.should == 2
|
278
|
+
end
|
279
|
+
it "should fail horribly on a post" do
|
280
|
+
data = {"Contacts" => [{"DisplayName"=>"Wades Contact","PrimaryEmail"=>"wade11@fbsdata.com"}]}
|
281
|
+
expect { subject.post('/contacts', data)}.to raise_error(FlexmlsApi::PermissionDenied){ |e| e.code.should == FlexmlsApi::ResponseCodes::SESSION_TOKEN_EXPIRED }
|
282
|
+
subject.reauthenticated.should == 2
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe FlexmlsApi do
|
4
|
+
it "should load the version" do
|
5
|
+
subject::VERSION.should match(/\d+\.\d+\.\d+/)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should give me a client connection" do
|
9
|
+
subject.client.class.should eq FlexmlsApi::Client
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should reset my connection" do
|
13
|
+
c1 = subject.client
|
14
|
+
subject.reset
|
15
|
+
subject.client.should_not eq c1
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe FlexmlsApi::Authentication, "Authentication" do
|
21
|
+
describe "build_param_hash" do
|
22
|
+
before(:each) do
|
23
|
+
class StubClass
|
24
|
+
end
|
25
|
+
@auth_stub = StubClass.new
|
26
|
+
@auth_stub.extend(FlexmlsApi::Authentication)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "Should return a blank string when passed nil" do
|
30
|
+
@auth_stub.build_param_string(nil).should be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return a correct param string for one item" do
|
34
|
+
@auth_stub.build_param_string({:foo => "bar"}).should match "foobar"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should alphabatize the param names by key first, then by value" do
|
38
|
+
@auth_stub.build_param_string({:zoo => "zar", :ooo => "car"}).should match "ooocarzoozar"
|
39
|
+
@auth_stub.build_param_string({:Akey => "aValue", :aNotherkey => "AnotherValue"}).should
|
40
|
+
match "AkeyaValueaNotherkeyAnotherValue"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
metadata
ADDED
@@ -0,0 +1,315 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flexmls_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Brandon Hornseth
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-28 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
requirement: *id001
|
32
|
+
prerelease: false
|
33
|
+
type: :runtime
|
34
|
+
name: faraday
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 3
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
version: "0"
|
45
|
+
requirement: *id002
|
46
|
+
prerelease: false
|
47
|
+
type: :runtime
|
48
|
+
name: curb
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
requirement: *id003
|
60
|
+
prerelease: false
|
61
|
+
type: :runtime
|
62
|
+
name: faraday_middleware
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 3
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
requirement: *id004
|
74
|
+
prerelease: false
|
75
|
+
type: :runtime
|
76
|
+
name: multi_json
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
requirement: *id005
|
88
|
+
prerelease: false
|
89
|
+
type: :runtime
|
90
|
+
name: json
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
requirement: *id006
|
102
|
+
prerelease: false
|
103
|
+
type: :runtime
|
104
|
+
name: yajl-ruby
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - "="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 15
|
112
|
+
segments:
|
113
|
+
- 2
|
114
|
+
- 1
|
115
|
+
- 2
|
116
|
+
version: 2.1.2
|
117
|
+
requirement: *id007
|
118
|
+
prerelease: false
|
119
|
+
type: :runtime
|
120
|
+
name: builder
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ~>
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: -1876988247
|
128
|
+
segments:
|
129
|
+
- 3
|
130
|
+
- 0
|
131
|
+
- pre2
|
132
|
+
version: 3.0.pre2
|
133
|
+
requirement: *id008
|
134
|
+
prerelease: false
|
135
|
+
type: :runtime
|
136
|
+
name: will_paginate
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
hash: 3
|
144
|
+
segments:
|
145
|
+
- 0
|
146
|
+
version: "0"
|
147
|
+
requirement: *id009
|
148
|
+
prerelease: false
|
149
|
+
type: :development
|
150
|
+
name: rspec
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
requirement: *id010
|
162
|
+
prerelease: false
|
163
|
+
type: :development
|
164
|
+
name: jeweler
|
165
|
+
- !ruby/object:Gem::Dependency
|
166
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
hash: 3
|
172
|
+
segments:
|
173
|
+
- 0
|
174
|
+
version: "0"
|
175
|
+
requirement: *id011
|
176
|
+
prerelease: false
|
177
|
+
type: :development
|
178
|
+
name: curb
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
hash: 3
|
186
|
+
segments:
|
187
|
+
- 0
|
188
|
+
version: "0"
|
189
|
+
requirement: *id012
|
190
|
+
prerelease: false
|
191
|
+
type: :development
|
192
|
+
name: json
|
193
|
+
description: A library for interacting with the flexmls web services.
|
194
|
+
email: api-support@flexmls.com
|
195
|
+
executables: []
|
196
|
+
|
197
|
+
extensions: []
|
198
|
+
|
199
|
+
extra_rdoc_files:
|
200
|
+
- LICENSE
|
201
|
+
- README.md
|
202
|
+
files:
|
203
|
+
- Gemfile
|
204
|
+
- Gemfile.lock
|
205
|
+
- LICENSE
|
206
|
+
- README.md
|
207
|
+
- Rakefile
|
208
|
+
- VERSION
|
209
|
+
- lib/flexmls_api.rb
|
210
|
+
- lib/flexmls_api/authentication.rb
|
211
|
+
- lib/flexmls_api/client.rb
|
212
|
+
- lib/flexmls_api/configuration.rb
|
213
|
+
- lib/flexmls_api/faraday.rb
|
214
|
+
- lib/flexmls_api/models.rb
|
215
|
+
- lib/flexmls_api/models/base.rb
|
216
|
+
- lib/flexmls_api/models/connect_prefs.rb
|
217
|
+
- lib/flexmls_api/models/contact.rb
|
218
|
+
- lib/flexmls_api/models/custom_fields.rb
|
219
|
+
- lib/flexmls_api/models/document.rb
|
220
|
+
- lib/flexmls_api/models/idx_link.rb
|
221
|
+
- lib/flexmls_api/models/listing.rb
|
222
|
+
- lib/flexmls_api/models/market_statistics.rb
|
223
|
+
- lib/flexmls_api/models/photo.rb
|
224
|
+
- lib/flexmls_api/models/property_types.rb
|
225
|
+
- lib/flexmls_api/models/standard_fields.rb
|
226
|
+
- lib/flexmls_api/models/subresource.rb
|
227
|
+
- lib/flexmls_api/models/system_info.rb
|
228
|
+
- lib/flexmls_api/models/video.rb
|
229
|
+
- lib/flexmls_api/models/virtual_tour.rb
|
230
|
+
- lib/flexmls_api/paginate.rb
|
231
|
+
- lib/flexmls_api/request.rb
|
232
|
+
- lib/flexmls_api/version.rb
|
233
|
+
- spec/fixtures/contacts.json
|
234
|
+
- spec/fixtures/listing_document_index.json
|
235
|
+
- spec/fixtures/listing_no_subresources.json
|
236
|
+
- spec/fixtures/listing_photos_index.json
|
237
|
+
- spec/fixtures/listing_videos_index.json
|
238
|
+
- spec/fixtures/listing_virtual_tours_index.json
|
239
|
+
- spec/fixtures/listing_with_documents.json
|
240
|
+
- spec/fixtures/listing_with_photos.json
|
241
|
+
- spec/fixtures/listing_with_supplement.json
|
242
|
+
- spec/fixtures/listing_with_videos.json
|
243
|
+
- spec/fixtures/listing_with_vtour.json
|
244
|
+
- spec/fixtures/session.json
|
245
|
+
- spec/json_helper.rb
|
246
|
+
- spec/spec_helper.rb
|
247
|
+
- spec/unit/flexmls_api/configuration_spec.rb
|
248
|
+
- spec/unit/flexmls_api/faraday_spec.rb
|
249
|
+
- spec/unit/flexmls_api/models/base_spec.rb
|
250
|
+
- spec/unit/flexmls_api/models/connect_prefs_spec.rb
|
251
|
+
- spec/unit/flexmls_api/models/contact_spec.rb
|
252
|
+
- spec/unit/flexmls_api/models/document_spec.rb
|
253
|
+
- spec/unit/flexmls_api/models/listing_spec.rb
|
254
|
+
- spec/unit/flexmls_api/models/photo_spec.rb
|
255
|
+
- spec/unit/flexmls_api/models/property_types_spec.rb
|
256
|
+
- spec/unit/flexmls_api/models/standard_fields_spec.rb
|
257
|
+
- spec/unit/flexmls_api/models/system_info_spec.rb
|
258
|
+
- spec/unit/flexmls_api/models/video_spec.rb
|
259
|
+
- spec/unit/flexmls_api/models/virtual_tour_spec.rb
|
260
|
+
- spec/unit/flexmls_api/paginate_spec.rb
|
261
|
+
- spec/unit/flexmls_api/request_spec.rb
|
262
|
+
- spec/unit/flexmls_api_spec.rb
|
263
|
+
has_rdoc: true
|
264
|
+
homepage: https://github.com/flexmls/flexmls_api
|
265
|
+
licenses: []
|
266
|
+
|
267
|
+
post_install_message:
|
268
|
+
rdoc_options: []
|
269
|
+
|
270
|
+
require_paths:
|
271
|
+
- lib
|
272
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
273
|
+
none: false
|
274
|
+
requirements:
|
275
|
+
- - ">="
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
hash: 3
|
278
|
+
segments:
|
279
|
+
- 0
|
280
|
+
version: "0"
|
281
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
282
|
+
none: false
|
283
|
+
requirements:
|
284
|
+
- - ">="
|
285
|
+
- !ruby/object:Gem::Version
|
286
|
+
hash: 3
|
287
|
+
segments:
|
288
|
+
- 0
|
289
|
+
version: "0"
|
290
|
+
requirements: []
|
291
|
+
|
292
|
+
rubyforge_project:
|
293
|
+
rubygems_version: 1.3.7
|
294
|
+
signing_key:
|
295
|
+
specification_version: 3
|
296
|
+
summary: A library for interacting with the flexmls web services.
|
297
|
+
test_files:
|
298
|
+
- spec/json_helper.rb
|
299
|
+
- spec/spec_helper.rb
|
300
|
+
- spec/unit/flexmls_api/configuration_spec.rb
|
301
|
+
- spec/unit/flexmls_api/faraday_spec.rb
|
302
|
+
- spec/unit/flexmls_api/models/base_spec.rb
|
303
|
+
- spec/unit/flexmls_api/models/connect_prefs_spec.rb
|
304
|
+
- spec/unit/flexmls_api/models/contact_spec.rb
|
305
|
+
- spec/unit/flexmls_api/models/document_spec.rb
|
306
|
+
- spec/unit/flexmls_api/models/listing_spec.rb
|
307
|
+
- spec/unit/flexmls_api/models/photo_spec.rb
|
308
|
+
- spec/unit/flexmls_api/models/property_types_spec.rb
|
309
|
+
- spec/unit/flexmls_api/models/standard_fields_spec.rb
|
310
|
+
- spec/unit/flexmls_api/models/system_info_spec.rb
|
311
|
+
- spec/unit/flexmls_api/models/video_spec.rb
|
312
|
+
- spec/unit/flexmls_api/models/virtual_tour_spec.rb
|
313
|
+
- spec/unit/flexmls_api/paginate_spec.rb
|
314
|
+
- spec/unit/flexmls_api/request_spec.rb
|
315
|
+
- spec/unit/flexmls_api_spec.rb
|