spark_api 1.3.26 → 1.3.27
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 +8 -8
- data/VERSION +1 -1
- data/lib/spark_api/models.rb +1 -0
- data/lib/spark_api/models/idx_link.rb +1 -30
- data/lib/spark_api/models/news_feed_meta.rb +40 -0
- data/lib/spark_api/models/saved_search.rb +6 -7
- data/spec/fixtures/newsfeeds/meta.json +131 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/spark_api/models/news_feed_meta_spec.rb +35 -0
- data/spec/unit/spark_api/models/saved_search_spec.rb +6 -7
- metadata +8 -17
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDVkM2ZjNzEwMTE4ZDQ5ODE0MjY5NjUxZjNiMjEzNDViMjdhMmM3Mg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTA0NGE5NWRmNmI1Mzc4Y2Y3NDRhMzBjMjQ2MzgzZWFhNDNhNWFmMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTVlMmNiZjVlNDcyYzBmMDBlY2RjNzY2MzMyY2Q3YTRhZWU2OTE3MmFkMzcz
|
10
|
+
MDk3YzZjNmE5MzBiNWRiOGFjY2QxYWJlZWJiZmJmMzg5NmVkZDkzOTI3OTQ1
|
11
|
+
OTZmYWI5NTFiYjNhZjliNzhmYTJiMjBmMDhhMzE3NDhjMzllMWI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzM2ZmY1NTZhNzgxYjZhMTlmM2Y0Nzg1Y2Q2M2ZmZDVmZDBjM2M2YjMyNGJi
|
14
|
+
Nzg4Mjc0MWZlNDI3ODczMDY0NTdhYWRhZjlhM2JjMjg4NjJiMDM1MzJlYjI4
|
15
|
+
MDc0MGQxZmZhYmIwNzM4MjVhYTM4YzBhNzljMzA4NDQxZmQ1ZDA=
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.27
|
data/lib/spark_api/models.rb
CHANGED
@@ -18,6 +18,7 @@ require 'spark_api/models/listing'
|
|
18
18
|
require 'spark_api/models/listing_cart'
|
19
19
|
require 'spark_api/models/market_statistics'
|
20
20
|
require 'spark_api/models/message'
|
21
|
+
require 'spark_api/models/news_feed_meta'
|
21
22
|
require 'spark_api/models/newsfeed'
|
22
23
|
require 'spark_api/models/note'
|
23
24
|
require 'spark_api/models/notification'
|
@@ -4,44 +4,15 @@ module SparkApi
|
|
4
4
|
|
5
5
|
extend Finders
|
6
6
|
|
7
|
-
self.element_name="idxlinks"
|
7
|
+
self.element_name = "idxlinks"
|
8
8
|
|
9
9
|
LINK_TYPES = ["QuickSearch", "SavedSearch", "MyListings", "Roster"]
|
10
10
|
|
11
|
-
#TODO Work all below into common base class
|
12
|
-
def self.find(*arguments)
|
13
|
-
scope = arguments.slice!(0)
|
14
|
-
options = arguments.slice!(0) || {}
|
15
|
-
|
16
|
-
case scope
|
17
|
-
when :all then find_every(options)
|
18
|
-
when :first then find_every(options).first
|
19
|
-
when :last then find_every(options).last
|
20
|
-
when :one then find_one(options)
|
21
|
-
else find_single(scope, options)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.first(*arguments)
|
26
|
-
find(:first, *arguments)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.last(*arguments)
|
30
|
-
find(:last, *arguments)
|
31
|
-
end
|
32
|
-
|
33
11
|
def self.default(options = {})
|
34
12
|
response = connection.get("/#{self.element_name}/default", options).first
|
35
13
|
response.nil? ? nil : new(response)
|
36
14
|
end
|
37
15
|
|
38
|
-
private
|
39
|
-
|
40
|
-
def self.find_single(scope, options)
|
41
|
-
resp = SparkApi.client.get("/idxlinks/#{scope}", options)
|
42
|
-
new(resp.first)
|
43
|
-
end
|
44
|
-
|
45
16
|
end
|
46
17
|
end
|
47
18
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SparkApi
|
2
|
+
module Models
|
3
|
+
class NewsFeedMeta < Base
|
4
|
+
|
5
|
+
attr_accessor :data
|
6
|
+
|
7
|
+
self.element_name = "newsfeeds/meta"
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super
|
11
|
+
@data = connection.get(self.path).first
|
12
|
+
end
|
13
|
+
|
14
|
+
def minimum_core_fields
|
15
|
+
@data['Subscriptions']['SavedSearches']['MinimumCoreFields']
|
16
|
+
end
|
17
|
+
|
18
|
+
def core_field_names
|
19
|
+
fields = @data['Subscriptions']['SavedSearches']['CoreSearchFields']
|
20
|
+
|
21
|
+
@data['Subscriptions']['SavedSearches']['CoreStandardFields'].each do |field|
|
22
|
+
fields << field[1]['Label']
|
23
|
+
end
|
24
|
+
|
25
|
+
fields
|
26
|
+
end
|
27
|
+
|
28
|
+
def core_fields
|
29
|
+
fields = @data['Subscriptions']['SavedSearches']['CoreSearchFields']
|
30
|
+
|
31
|
+
@data['Subscriptions']['SavedSearches']['CoreStandardFields'].each do |field|
|
32
|
+
fields << field.first
|
33
|
+
end
|
34
|
+
|
35
|
+
fields
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -8,11 +8,6 @@ module SparkApi
|
|
8
8
|
|
9
9
|
attr_accessor :newsfeeds
|
10
10
|
|
11
|
-
# Newsfeed restriction criteria for saved searches:
|
12
|
-
# http://alpha.sparkplatform.com/docs/api_services/newsfeed/restrictions#criteria
|
13
|
-
QUALIFYING_FIELDS_FOR_NEWSFEED = %w(BathsTotal BedsTotal City CountyOrParish ListPrice Location MlsStatus
|
14
|
-
PostalCode PropertyType RoomsTotal State)
|
15
|
-
|
16
11
|
self.element_name="savedsearches"
|
17
12
|
|
18
13
|
def initialize(attributes={})
|
@@ -82,11 +77,11 @@ module SparkApi
|
|
82
77
|
|
83
78
|
number_of_filters = 0
|
84
79
|
|
85
|
-
|
80
|
+
news_feed_meta.core_fields.each do |field|
|
86
81
|
number_of_filters += 1 if self.Filter.include? field
|
87
82
|
end
|
88
83
|
|
89
|
-
number_of_filters >=
|
84
|
+
number_of_filters >= news_feed_meta.minimum_core_fields
|
90
85
|
|
91
86
|
end
|
92
87
|
|
@@ -124,6 +119,10 @@ module SparkApi
|
|
124
119
|
end
|
125
120
|
end
|
126
121
|
|
122
|
+
def news_feed_meta
|
123
|
+
@news_feed_meta ||= NewsFeedMeta.new
|
124
|
+
end
|
125
|
+
|
127
126
|
end
|
128
127
|
|
129
128
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
{
|
2
|
+
"D": {
|
3
|
+
"Results": [
|
4
|
+
{
|
5
|
+
"Events": ["New", "PriceChange", "Sold", "OpenHouse", "Pending", "BackOnMarket", "Extension", "StatusChange", "Recommended", "Shared", "Seeded"],
|
6
|
+
"Subscriptions": {
|
7
|
+
"SavedSearches": {
|
8
|
+
"CoreStandardFields": {
|
9
|
+
"MlsStatus": {
|
10
|
+
"ResourceUri": "/v1/standardfields/MlsStatus",
|
11
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
12
|
+
"Searchable": true,
|
13
|
+
"HasList": true,
|
14
|
+
"MaxListSize": 7,
|
15
|
+
"Type": "Character",
|
16
|
+
"MultiSelect": false,
|
17
|
+
"FieldCategory": "Main",
|
18
|
+
"Label": "Status"
|
19
|
+
},
|
20
|
+
"PropertyType": {
|
21
|
+
"ResourceUri": "/v1/standardfields/PropertyType",
|
22
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
23
|
+
"Searchable": true,
|
24
|
+
"HasList": false,
|
25
|
+
"MaxListSize": 0,
|
26
|
+
"Type": "Character",
|
27
|
+
"MultiSelect": false,
|
28
|
+
"FieldCategory": "Main",
|
29
|
+
"Label": "Property Type"
|
30
|
+
},
|
31
|
+
"PostalCode": {
|
32
|
+
"ResourceUri": "/v1/standardfields/PostalCode",
|
33
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
34
|
+
"Searchable": true,
|
35
|
+
"HasList": false,
|
36
|
+
"MaxListSize": 0,
|
37
|
+
"Type": "Character",
|
38
|
+
"MultiSelect": false,
|
39
|
+
"FieldCategory": "Main",
|
40
|
+
"Label": "Postal Code"
|
41
|
+
},
|
42
|
+
"ListPrice": {
|
43
|
+
"ResourceUri": "/v1/standardfields/ListPrice",
|
44
|
+
"MlsVisible": ["A", "I", "J", "K"],
|
45
|
+
"Searchable": true,
|
46
|
+
"HasList": false,
|
47
|
+
"MaxListSize": 0,
|
48
|
+
"Type": "Decimal",
|
49
|
+
"MultiSelect": false,
|
50
|
+
"Currency": true,
|
51
|
+
"FieldCategory": "Main",
|
52
|
+
"Label": "List Price"
|
53
|
+
},
|
54
|
+
"BedsTotal": {
|
55
|
+
"ResourceUri": "/v1/standardfields/BedsTotal",
|
56
|
+
"MlsVisible": ["A", "K", "N"],
|
57
|
+
"Searchable": true,
|
58
|
+
"HasList": false,
|
59
|
+
"MaxListSize": 0,
|
60
|
+
"Type": "Integer",
|
61
|
+
"MultiSelect": false,
|
62
|
+
"FieldCategory": "Main",
|
63
|
+
"Label": "Total Bedrooms"
|
64
|
+
},
|
65
|
+
"YearBuilt": {
|
66
|
+
"ResourceUri": "/v1/standardfields/YearBuilt",
|
67
|
+
"MlsVisible": ["A", "I", "K", "N"],
|
68
|
+
"Searchable": true,
|
69
|
+
"HasList": false,
|
70
|
+
"MaxListSize": 0,
|
71
|
+
"Type": "Integer",
|
72
|
+
"MultiSelect": false,
|
73
|
+
"FieldCategory": "Main",
|
74
|
+
"Label": "Year Built"
|
75
|
+
},
|
76
|
+
"BuildingAreaTotal": {
|
77
|
+
"ResourceUri": "/v1/standardfields/BuildingAreaTotal",
|
78
|
+
"MlsVisible": ["A", "I", "K", "N"],
|
79
|
+
"Searchable": true,
|
80
|
+
"HasList": false,
|
81
|
+
"MaxListSize": 0,
|
82
|
+
"Type": "Decimal",
|
83
|
+
"MultiSelect": false,
|
84
|
+
"FieldCategory": "Main",
|
85
|
+
"Label": "Total SqFt."
|
86
|
+
},
|
87
|
+
"PropertySubType": {
|
88
|
+
"ResourceUri": "/v1/standardfields/PropertySubType",
|
89
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
90
|
+
"Searchable": true,
|
91
|
+
"HasList": true,
|
92
|
+
"MaxListSize": 9,
|
93
|
+
"Type": "Character",
|
94
|
+
"MultiSelect": false,
|
95
|
+
"FieldCategory": "Main",
|
96
|
+
"Label": "Sub Type"
|
97
|
+
},
|
98
|
+
"SubdivisionName": {
|
99
|
+
"ResourceUri": "/v1/standardfields/SubdivisionName",
|
100
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
101
|
+
"Searchable": true,
|
102
|
+
"HasList": false,
|
103
|
+
"MaxListSize": 0,
|
104
|
+
"Type": "Character",
|
105
|
+
"MultiSelect": false,
|
106
|
+
"FieldCategory": "Main",
|
107
|
+
"Label": "Subdivision"
|
108
|
+
},
|
109
|
+
"MLSAreaMinor": {
|
110
|
+
"ResourceUri": "/v1/standardfields/MLSAreaMinor",
|
111
|
+
"MlsVisible": ["A", "I", "J", "K", "N"],
|
112
|
+
"Searchable": true,
|
113
|
+
"HasList": true,
|
114
|
+
"MaxListSize": 51,
|
115
|
+
"Type": "Character",
|
116
|
+
"MultiSelect": false,
|
117
|
+
"FieldCategory": "Main",
|
118
|
+
"Label": "Map Area"
|
119
|
+
}
|
120
|
+
},
|
121
|
+
"CoreSearchFields": [
|
122
|
+
"Location"
|
123
|
+
],
|
124
|
+
"MinimumCoreFields": 3
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
],
|
129
|
+
"Success": true
|
130
|
+
}
|
131
|
+
}
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe NewsFeedMeta do
|
5
|
+
|
6
|
+
let(:news_feed_meta) { NewsFeedMeta.new }
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_auth_request
|
10
|
+
stub_api_get("/newsfeeds/meta", "newsfeeds/meta.json")
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'minimum_core_fields' do
|
14
|
+
it 'returns the minimum number of required fields' do
|
15
|
+
expect(news_feed_meta.minimum_core_fields).to eq 3
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'core_field_names' do
|
20
|
+
it 'returns an array including both the CoreSearchFields and the CoreStandardFields' do
|
21
|
+
field_array = ["Location", "Status", "Property Type", "Postal Code", "List Price", "Total Bedrooms",
|
22
|
+
"Year Built", "Total SqFt.", "Sub Type", "Subdivision", "Map Area"]
|
23
|
+
expect(news_feed_meta.core_field_names).to eq field_array
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'core_fields' do
|
28
|
+
it 'returns an array including both the CoreSearchFields and the CoreStandardFields' do
|
29
|
+
field_array = ["Location", "MlsStatus", "PropertyType", "PostalCode", "ListPrice", "BedsTotal",
|
30
|
+
"YearBuilt", "BuildingAreaTotal", "PropertySubType", "SubdivisionName", "MLSAreaMinor"]
|
31
|
+
expect(news_feed_meta.core_fields).to eq field_array
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -178,12 +178,16 @@ describe SavedSearch do
|
|
178
178
|
|
179
179
|
describe "can_have_newsfeed?" do
|
180
180
|
|
181
|
+
before do
|
182
|
+
stub_api_get("/newsfeeds/meta", "newsfeeds/meta.json")
|
183
|
+
end
|
184
|
+
|
181
185
|
it "should return false without at least three filter parameters" do
|
182
186
|
stub_api_get("/#{subject.class.element_name}/#{id}", 'saved_searches/get.json')
|
183
187
|
resource = subject.class.find(id)
|
184
188
|
resource.stub(:has_active_newsfeed?) { false }
|
185
189
|
resource.stub(:has_inactive_newsfeed?) { false }
|
186
|
-
resource.Filter = "
|
190
|
+
resource.Filter = "MlsStatus Eq 'Active' And PropertyType Eq 'A'"
|
187
191
|
resource.can_have_newsfeed?.should == false
|
188
192
|
end
|
189
193
|
|
@@ -192,6 +196,7 @@ describe SavedSearch do
|
|
192
196
|
resource = subject.class.find(id)
|
193
197
|
resource.stub(:has_active_newsfeed?) { false }
|
194
198
|
resource.stub(:has_inactive_newsfeed?) { false }
|
199
|
+
resource.Filter = "MlsStatus Eq 'Active' And PropertyType Eq 'A' And ListPrice Eq 1000000"
|
195
200
|
resource.can_have_newsfeed?.should == true
|
196
201
|
end
|
197
202
|
|
@@ -243,11 +248,5 @@ describe SavedSearch do
|
|
243
248
|
resource.newsfeeds.should be_an(Array)
|
244
249
|
end
|
245
250
|
end
|
246
|
-
|
247
|
-
describe "QUALIFYING_FIELDS_FOR_NEWSFEED" do
|
248
|
-
it "should return an array" do
|
249
|
-
subject.class::QUALIFYING_FIELDS_FOR_NEWSFEED.should be_an(Array)
|
250
|
-
end
|
251
|
-
end
|
252
251
|
|
253
252
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spark_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.27
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Hornseth
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -177,20 +177,6 @@ dependencies:
|
|
177
177
|
- - ~>
|
178
178
|
- !ruby/object:Gem::Version
|
179
179
|
version: 1.7.0
|
180
|
-
- !ruby/object:Gem::Dependency
|
181
|
-
name: rcov
|
182
|
-
requirement: !ruby/object:Gem::Requirement
|
183
|
-
requirements:
|
184
|
-
- - ~>
|
185
|
-
- !ruby/object:Gem::Version
|
186
|
-
version: 0.9.9
|
187
|
-
type: :development
|
188
|
-
prerelease: false
|
189
|
-
version_requirements: !ruby/object:Gem::Requirement
|
190
|
-
requirements:
|
191
|
-
- - ~>
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
version: 0.9.9
|
194
180
|
- !ruby/object:Gem::Dependency
|
195
181
|
name: rb-readline
|
196
182
|
requirement: !ruby/object:Gem::Requirement
|
@@ -308,6 +294,7 @@ files:
|
|
308
294
|
- lib/spark_api/models/listing_cart.rb
|
309
295
|
- lib/spark_api/models/market_statistics.rb
|
310
296
|
- lib/spark_api/models/message.rb
|
297
|
+
- lib/spark_api/models/news_feed_meta.rb
|
311
298
|
- lib/spark_api/models/newsfeed.rb
|
312
299
|
- lib/spark_api/models/note.rb
|
313
300
|
- lib/spark_api/models/notification.rb
|
@@ -431,6 +418,7 @@ files:
|
|
431
418
|
- spec/fixtures/messages/post.json
|
432
419
|
- spec/fixtures/newsfeeds/get.json
|
433
420
|
- spec/fixtures/newsfeeds/inactive.json
|
421
|
+
- spec/fixtures/newsfeeds/meta.json
|
434
422
|
- spec/fixtures/no_results.json
|
435
423
|
- spec/fixtures/notes/add.json
|
436
424
|
- spec/fixtures/notes/agent_shared.json
|
@@ -500,6 +488,7 @@ files:
|
|
500
488
|
- spec/unit/spark_api/models/listing_cart_spec.rb
|
501
489
|
- spec/unit/spark_api/models/listing_spec.rb
|
502
490
|
- spec/unit/spark_api/models/message_spec.rb
|
491
|
+
- spec/unit/spark_api/models/news_feed_meta_spec.rb
|
503
492
|
- spec/unit/spark_api/models/newsfeed_spec.rb
|
504
493
|
- spec/unit/spark_api/models/note_spec.rb
|
505
494
|
- spec/unit/spark_api/models/notification_spec.rb
|
@@ -545,7 +534,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
545
534
|
version: '1.8'
|
546
535
|
requirements: []
|
547
536
|
rubyforge_project: spark_api
|
548
|
-
rubygems_version: 2.2.
|
537
|
+
rubygems_version: 2.2.5
|
549
538
|
signing_key:
|
550
539
|
specification_version: 4
|
551
540
|
summary: A library for interacting with the Spark web services.
|
@@ -611,6 +600,7 @@ test_files:
|
|
611
600
|
- spec/fixtures/errors/failure_with_msg.json
|
612
601
|
- spec/fixtures/errors/failure.json
|
613
602
|
- spec/fixtures/errors/failure_with_constraint.json
|
603
|
+
- spec/fixtures/newsfeeds/meta.json
|
614
604
|
- spec/fixtures/newsfeeds/inactive.json
|
615
605
|
- spec/fixtures/newsfeeds/get.json
|
616
606
|
- spec/fixtures/property_types/property_types.json
|
@@ -696,6 +686,7 @@ test_files:
|
|
696
686
|
- spec/unit/spark_api/authentication/base_auth_spec.rb
|
697
687
|
- spec/unit/spark_api/configuration_spec.rb
|
698
688
|
- spec/unit/spark_api/request_spec.rb
|
689
|
+
- spec/unit/spark_api/models/news_feed_meta_spec.rb
|
699
690
|
- spec/unit/spark_api/models/open_house_spec.rb
|
700
691
|
- spec/unit/spark_api/models/document_spec.rb
|
701
692
|
- spec/unit/spark_api/models/system_info_spec.rb
|