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.
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