flexmls_api 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/Gemfile +20 -0
  2. data/Gemfile.lock +60 -0
  3. data/LICENSE +14 -0
  4. data/README.md +128 -0
  5. data/Rakefile +78 -0
  6. data/VERSION +1 -0
  7. data/lib/flexmls_api/authentication.rb +104 -0
  8. data/lib/flexmls_api/client.rb +20 -0
  9. data/lib/flexmls_api/configuration.rb +40 -0
  10. data/lib/flexmls_api/faraday.rb +52 -0
  11. data/lib/flexmls_api/models/base.rb +76 -0
  12. data/lib/flexmls_api/models/connect_prefs.rb +10 -0
  13. data/lib/flexmls_api/models/contact.rb +25 -0
  14. data/lib/flexmls_api/models/custom_fields.rb +12 -0
  15. data/lib/flexmls_api/models/document.rb +11 -0
  16. data/lib/flexmls_api/models/idx_link.rb +45 -0
  17. data/lib/flexmls_api/models/listing.rb +110 -0
  18. data/lib/flexmls_api/models/market_statistics.rb +33 -0
  19. data/lib/flexmls_api/models/photo.rb +15 -0
  20. data/lib/flexmls_api/models/property_types.rb +7 -0
  21. data/lib/flexmls_api/models/standard_fields.rb +7 -0
  22. data/lib/flexmls_api/models/subresource.rb +13 -0
  23. data/lib/flexmls_api/models/system_info.rb +7 -0
  24. data/lib/flexmls_api/models/video.rb +16 -0
  25. data/lib/flexmls_api/models/virtual_tour.rb +18 -0
  26. data/lib/flexmls_api/models.rb +21 -0
  27. data/lib/flexmls_api/paginate.rb +87 -0
  28. data/lib/flexmls_api/request.rb +172 -0
  29. data/lib/flexmls_api/version.rb +4 -0
  30. data/lib/flexmls_api.rb +41 -0
  31. data/spec/fixtures/contacts.json +25 -0
  32. data/spec/fixtures/listing_document_index.json +19 -0
  33. data/spec/fixtures/listing_no_subresources.json +38 -0
  34. data/spec/fixtures/listing_photos_index.json +469 -0
  35. data/spec/fixtures/listing_videos_index.json +18 -0
  36. data/spec/fixtures/listing_virtual_tours_index.json +42 -0
  37. data/spec/fixtures/listing_with_documents.json +52 -0
  38. data/spec/fixtures/listing_with_photos.json +110 -0
  39. data/spec/fixtures/listing_with_supplement.json +39 -0
  40. data/spec/fixtures/listing_with_videos.json +54 -0
  41. data/spec/fixtures/listing_with_vtour.json +48 -0
  42. data/spec/fixtures/session.json +10 -0
  43. data/spec/json_helper.rb +77 -0
  44. data/spec/spec_helper.rb +78 -0
  45. data/spec/unit/flexmls_api/configuration_spec.rb +97 -0
  46. data/spec/unit/flexmls_api/faraday_spec.rb +94 -0
  47. data/spec/unit/flexmls_api/models/base_spec.rb +62 -0
  48. data/spec/unit/flexmls_api/models/connect_prefs_spec.rb +9 -0
  49. data/spec/unit/flexmls_api/models/contact_spec.rb +70 -0
  50. data/spec/unit/flexmls_api/models/document_spec.rb +39 -0
  51. data/spec/unit/flexmls_api/models/listing_spec.rb +174 -0
  52. data/spec/unit/flexmls_api/models/photo_spec.rb +59 -0
  53. data/spec/unit/flexmls_api/models/property_types_spec.rb +20 -0
  54. data/spec/unit/flexmls_api/models/standard_fields_spec.rb +42 -0
  55. data/spec/unit/flexmls_api/models/system_info_spec.rb +37 -0
  56. data/spec/unit/flexmls_api/models/video_spec.rb +43 -0
  57. data/spec/unit/flexmls_api/models/virtual_tour_spec.rb +46 -0
  58. data/spec/unit/flexmls_api/paginate_spec.rb +221 -0
  59. data/spec/unit/flexmls_api/request_spec.rb +288 -0
  60. data/spec/unit/flexmls_api_spec.rb +44 -0
  61. 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