real_savvy 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/client.rb +38 -0
- data/lib/real_savvy/adapter/agent.rb +6 -0
- data/lib/real_savvy/adapter/agent_profile.rb +6 -0
- data/lib/real_savvy/adapter/base.rb +19 -0
- data/lib/real_savvy/adapter/broker_office.rb +6 -0
- data/lib/real_savvy/adapter/collection.rb +30 -0
- data/lib/real_savvy/adapter/markets.rb +9 -0
- data/lib/real_savvy/adapter/open_house.rb +6 -0
- data/lib/real_savvy/adapter/property.rb +17 -0
- data/lib/real_savvy/adapter/saved_search.rb +11 -0
- data/lib/real_savvy/adapter/site.rb +7 -0
- data/lib/real_savvy/adapter/user.rb +13 -0
- data/lib/real_savvy/adapter.rb +8 -0
- data/lib/real_savvy/attributes.rb +4 -0
- data/lib/real_savvy/client.rb +85 -0
- data/lib/real_savvy/concern/complex_show_for_adapter.rb +6 -0
- data/lib/real_savvy/concern/create_for_adapter.rb +5 -0
- data/lib/real_savvy/concern/delegate_to_connection.rb +21 -0
- data/lib/real_savvy/concern/destroy_for_adapter.rb +5 -0
- data/lib/real_savvy/concern/index_for_adapter.rb +7 -0
- data/lib/real_savvy/concern/invites_actions_for_adapter.rb +13 -0
- data/lib/real_savvy/concern/show_for_adapter.rb +5 -0
- data/lib/real_savvy/concern/update_for_adapter.rb +5 -0
- data/lib/real_savvy/concern.rb +5 -0
- data/lib/real_savvy/connection.rb +29 -0
- data/lib/real_savvy/document.rb +60 -0
- data/lib/real_savvy/links.rb +4 -0
- data/lib/real_savvy/meta.rb +4 -0
- data/lib/real_savvy/resource/base.rb +95 -0
- data/lib/real_savvy/resource/collection.rb +4 -0
- data/lib/real_savvy/resource/property.rb +3 -0
- data/lib/real_savvy/resource/saved_search.rb +4 -0
- data/lib/real_savvy/resource/user.rb +3 -0
- data/lib/real_savvy/resource.rb +6 -0
- data/lib/real_savvy/version.rb +3 -0
- data/lib/real_savvy.rb +14 -0
- data/real_savvy.gemspec +31 -0
- metadata +171 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4ec995c778fa1380bda1308281b30d8d143ad78a
|
4
|
+
data.tar.gz: a87ce301ef34291b8c1679c2c9c01cad51453631
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2ba195c43226ec745e1d345675cd5ebaa00c0b0c08e6e1536e5dce6f8dcddf695bb89974b9f1e3e2ab02c6d4897ac715097c0a905af49f3c6d3c7145dcd8ca63
|
7
|
+
data.tar.gz: 02c061df9794ec1ba497fbda7e593c9fc80e5dae445b5517a902a49f86cf00fbee24ca091de265de77449365a2d1ce78c28e7f61ebb20b5c4dafe0bfae18bf85
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Andrew Rove
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "real_savvy"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/client.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'real_savvy/connection'
|
2
|
+
require 'real_savvy/concern'
|
3
|
+
require 'real_savvy/adapter'
|
4
|
+
|
5
|
+
Dir[File.dirname(__FILE__) + '/adapaters/*.rb'].each {|file| require file }
|
6
|
+
|
7
|
+
class RealSavvy::Client
|
8
|
+
def initialize(token:, logger: nil)
|
9
|
+
@token = token
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def connection
|
14
|
+
@connection ||= RealSavvy::Connection.new(client: self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def logger
|
18
|
+
@logger
|
19
|
+
end
|
20
|
+
|
21
|
+
def logging?
|
22
|
+
!!@logging
|
23
|
+
end
|
24
|
+
|
25
|
+
def token
|
26
|
+
@token
|
27
|
+
end
|
28
|
+
|
29
|
+
def properties
|
30
|
+
resource_adapaters[:properties] ||= RealSavvy::Adapter::Property.new(connection: connection)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def resource_adapaters
|
36
|
+
@resource_adapaters ||= {}
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class RealSavvy::Adapter::Base
|
2
|
+
include RealSavvy::Concern::DelegateToConnection
|
3
|
+
|
4
|
+
def self.path_prefix_is path_prefix
|
5
|
+
@path_prefix = path_prefix
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.path_prefix
|
9
|
+
@path_prefix
|
10
|
+
end
|
11
|
+
|
12
|
+
def path_prefix
|
13
|
+
self.class.path_prefix
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(connection:)
|
17
|
+
@connection = connection
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class RealSavvy::Adapter::Collection < RealSavvy::Adapter::Base
|
2
|
+
path_prefix_is 'collections'
|
3
|
+
|
4
|
+
include RealSavvy::Concern::ShowForAdapter
|
5
|
+
include RealSavvy::Concern::IndexForAdapter
|
6
|
+
include RealSavvy::Concern::CreateForAdapter
|
7
|
+
include RealSavvy::Concern::UpdateForAdapter
|
8
|
+
include RealSavvy::Concern::DestroyForAdapter
|
9
|
+
include RealSavvy::Concern::InvitesActionsForAdapter
|
10
|
+
|
11
|
+
def add(id:, property_ids:)
|
12
|
+
put("./api/v3/#{path_prefix}/#{id}/add", {property_ids: property_ids})
|
13
|
+
end
|
14
|
+
|
15
|
+
def remove(id:, property_ids:)
|
16
|
+
delete("./api/v3/#{path_prefix}/#{id}/remove", {property_ids: property_ids})
|
17
|
+
end
|
18
|
+
|
19
|
+
def search(id:, filter: {}, market_id: nil, page_size: nil, page_number: nil, page: {})
|
20
|
+
page[:size] ||= page_size
|
21
|
+
page[:number] ||= page_number
|
22
|
+
post("./api/v3/#{path_prefix}/#{id}/properties/search", {filter: filter, market_id: market_id, page: page})
|
23
|
+
end
|
24
|
+
|
25
|
+
def cluster(id:, filter: {}, market_id: nil, page_size: nil, page_number: nil, page: {}, precision: nil)
|
26
|
+
page[:size] ||= page_size
|
27
|
+
page[:number] ||= page_number
|
28
|
+
post("./api/v3/#{path_prefix}/#{id}/properties/map/clusters", {filter: filter, market_id: market_id, page: page, precision: precision})
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class RealSavvy::Adapter::Market < RealSavvy::Adapter::Base
|
2
|
+
path_prefix_is 'markets'
|
3
|
+
|
4
|
+
include RealSavvy::Concern::ShowForAdapter
|
5
|
+
include RealSavvy::Concern::IndexForAdapter
|
6
|
+
include RealSavvy::Concern::CreateForAdapter
|
7
|
+
include RealSavvy::Concern::UpdateForAdapter
|
8
|
+
include RealSavvy::Concern::DestroyForAdapter
|
9
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class RealSavvy::Adapter::Property < RealSavvy::Adapter::Base
|
2
|
+
path_prefix_is 'properties'
|
3
|
+
|
4
|
+
include RealSavvy::Concern::ComplexShowForAdapter
|
5
|
+
|
6
|
+
def search(filter: {}, market_id: nil, page_size: nil, page_number: nil, page: {})
|
7
|
+
page[:size] ||= page_size
|
8
|
+
page[:number] ||= page_number
|
9
|
+
post("./api/v3/#{path_prefix}/search", {filter: filter, market_id: market_id, page: page})
|
10
|
+
end
|
11
|
+
|
12
|
+
def cluster(filter: {}, market_id: nil, page_size: nil, page_number: nil, page: {}, precision: nil)
|
13
|
+
page[:size] ||= page_size
|
14
|
+
page[:number] ||= page_number
|
15
|
+
post("./api/v3/#{path_prefix}/map/clusters", {filter: filter, market_id: market_id, page: page, precision: precision})
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class RealSavvy::Adapter::SavedSearch < RealSavvy::Adapter::Base
|
2
|
+
path_prefix_is 'saved_searches'
|
3
|
+
|
4
|
+
include RealSavvy::Concern::ShowForAdapter
|
5
|
+
include RealSavvy::Concern::IndexForAdapter
|
6
|
+
include RealSavvy::Concern::CreateForAdapter
|
7
|
+
include RealSavvy::Concern::UpdateForAdapter
|
8
|
+
include RealSavvy::Concern::DestroyForAdapter
|
9
|
+
|
10
|
+
include RealSavvy::Concern::InvitesActionsForAdapter
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class RealSavvy::Adapter::User < RealSavvy::Adapter::Base
|
2
|
+
path_prefix_is 'users'
|
3
|
+
|
4
|
+
include RealSavvy::Concern::ShowForAdapter
|
5
|
+
include RealSavvy::Concern::IndexForAdapter
|
6
|
+
include RealSavvy::Concern::CreateForAdapter
|
7
|
+
include RealSavvy::Concern::UpdateForAdapter
|
8
|
+
include RealSavvy::Concern::DestroyForAdapter
|
9
|
+
|
10
|
+
def me
|
11
|
+
get("./api/v3/#{path_prefix}/me")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'real_savvy/connection'
|
2
|
+
require 'real_savvy/concern'
|
3
|
+
require 'real_savvy/adapter'
|
4
|
+
|
5
|
+
class RealSavvy::Client
|
6
|
+
ADAPTER_LOOKUP = {
|
7
|
+
agent_profiles: RealSavvy::Adapter::AgentProfile,
|
8
|
+
agents: RealSavvy::Adapter::Agent,
|
9
|
+
broker_offices: RealSavvy::Adapter::BrokerOffice,
|
10
|
+
collections: RealSavvy::Adapter::Collection,
|
11
|
+
markets: RealSavvy::Adapter::Market,
|
12
|
+
open_houses: RealSavvy::Adapter::OpenHouse,
|
13
|
+
properties: RealSavvy::Adapter::Property,
|
14
|
+
listings: RealSavvy::Adapter::Property,
|
15
|
+
saved_searches: RealSavvy::Adapter::SavedSearch,
|
16
|
+
site: RealSavvy::Adapter::Site,
|
17
|
+
sites: RealSavvy::Adapter::Site,
|
18
|
+
users: RealSavvy::Adapter::User,
|
19
|
+
user: RealSavvy::Adapter::User,
|
20
|
+
}.freeze
|
21
|
+
|
22
|
+
def initialize(token:, api_url: 'https://api.realsavvy.com', logger: nil, impersonated_user_id: nil)
|
23
|
+
@token = token
|
24
|
+
@api_url = api_url
|
25
|
+
@logger = logger
|
26
|
+
@impersonated_user_id = impersonated_user_id
|
27
|
+
end
|
28
|
+
|
29
|
+
def connection
|
30
|
+
@connection ||= RealSavvy::Connection.new(client: self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def logger
|
34
|
+
@logger
|
35
|
+
end
|
36
|
+
|
37
|
+
def logging?
|
38
|
+
!!@logging
|
39
|
+
end
|
40
|
+
|
41
|
+
def token
|
42
|
+
@token
|
43
|
+
end
|
44
|
+
|
45
|
+
def api_url
|
46
|
+
@api_url
|
47
|
+
end
|
48
|
+
|
49
|
+
def impersonated_user_id
|
50
|
+
@impersonated_user_id
|
51
|
+
end
|
52
|
+
|
53
|
+
class AdapterProxy
|
54
|
+
attr_reader :adapter
|
55
|
+
|
56
|
+
def initialize(adapter)
|
57
|
+
@adapter = adapter
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def method_missing(method, *args, &block)
|
63
|
+
response = @adapter.send(method, *args, &block)
|
64
|
+
RealSavvy::Document.new(response.body, status: response.status)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_adapter(name)
|
69
|
+
resource_adapaters[name] ||= AdapterProxy.new(ADAPTER_LOOKUP[name].new(connection: connection))
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def resource_adapaters
|
75
|
+
@resource_adapaters ||= {}
|
76
|
+
end
|
77
|
+
|
78
|
+
def method_missing(m, *args, &block)
|
79
|
+
if ADAPTER_LOOKUP[m]
|
80
|
+
get_adapter(m)
|
81
|
+
else
|
82
|
+
super
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module RealSavvy::Concern::DelegateToConnection
|
2
|
+
def connection
|
3
|
+
@connection
|
4
|
+
end
|
5
|
+
|
6
|
+
def get(*args)
|
7
|
+
connection.get(*args)
|
8
|
+
end
|
9
|
+
|
10
|
+
def post(*args)
|
11
|
+
connection.post(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def put(*args)
|
15
|
+
connection.put(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(*args)
|
19
|
+
connection.delete(*args)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RealSavvy::Concern::InvitesActionsForAdapter
|
2
|
+
def invite(id:, email:)
|
3
|
+
put("./api/v3/#{path_prefix}/#{id}/invite", {email: email})
|
4
|
+
end
|
5
|
+
|
6
|
+
def accept_invite(id:, given:)
|
7
|
+
put("./api/v3/#{path_prefix}/#{id}/accept_invite", {given: given})
|
8
|
+
end
|
9
|
+
|
10
|
+
def uninvite(id:, email:)
|
11
|
+
delete("./api/v3/#{path_prefix}/#{id}/uninvite", {email: email})
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
class RealSavvy::Connection
|
5
|
+
attr_reader :faraday
|
6
|
+
|
7
|
+
def initialize(client:)
|
8
|
+
@faraday = ::Faraday.new(client.api_url) do |faraday|
|
9
|
+
faraday.request :json
|
10
|
+
faraday.response :json
|
11
|
+
|
12
|
+
faraday.response :logger, client.logger if client.logging?
|
13
|
+
faraday.adapter Faraday.default_adapter
|
14
|
+
|
15
|
+
faraday.headers['Authorization'] = "Bearer #{client.token}"
|
16
|
+
faraday.params['impersonated_user_id'] = client.impersonated_user_id if client.impersonated_user_id
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def delegate(m, *args, &block)
|
23
|
+
faraday.send(m, *args, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(m, *args, &block)
|
27
|
+
delegate(m, *args, &block)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'real_savvy/meta'
|
2
|
+
require 'real_savvy/resource'
|
3
|
+
|
4
|
+
class RealSavvy::Document
|
5
|
+
|
6
|
+
attr_reader :document
|
7
|
+
|
8
|
+
TYPE_TO_RESOURCE = {
|
9
|
+
'properties' => RealSavvy::Resource::Property,
|
10
|
+
'listings' => RealSavvy::Resource::Property,
|
11
|
+
'collections' => RealSavvy::Resource::Collection,
|
12
|
+
'saved_searches' => RealSavvy::Resource::SavedSearch,
|
13
|
+
'users' => RealSavvy::Resource::User,
|
14
|
+
}.tap do |lookup|
|
15
|
+
lookup.default = RealSavvy::Resource::Base
|
16
|
+
end.freeze
|
17
|
+
|
18
|
+
def initialize(document, status: nil)
|
19
|
+
@document = document
|
20
|
+
@status = status
|
21
|
+
end
|
22
|
+
|
23
|
+
def data
|
24
|
+
@data ||= self.class.process_resources(document['data'], self)
|
25
|
+
end
|
26
|
+
|
27
|
+
alias results data
|
28
|
+
|
29
|
+
def result
|
30
|
+
data[0]
|
31
|
+
end
|
32
|
+
|
33
|
+
def included
|
34
|
+
@included ||= self.class.process_resources(document['included'], self)
|
35
|
+
end
|
36
|
+
|
37
|
+
def meta
|
38
|
+
@meta ||= RealSavvy::Meta.new(document['meta'] || {})
|
39
|
+
end
|
40
|
+
|
41
|
+
def errors
|
42
|
+
@errors ||= document['errors'] || {}
|
43
|
+
end
|
44
|
+
|
45
|
+
def status
|
46
|
+
@status
|
47
|
+
end
|
48
|
+
|
49
|
+
def objects_lookup
|
50
|
+
@objects_lookup ||= (data + included).each_with_object({}) { |resource, result| result[resource.hash] = resource }
|
51
|
+
end
|
52
|
+
|
53
|
+
def inspect
|
54
|
+
document.inspect
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.process_resources(resources, document=nil)
|
58
|
+
::RealSavvy.safe_wrap(resources).map { |object| TYPE_TO_RESOURCE[object['type']].new(object, document) }
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'real_savvy/attributes'
|
3
|
+
require 'real_savvy/links'
|
4
|
+
|
5
|
+
class RealSavvy::Resource::Base
|
6
|
+
attr_reader :json, :document
|
7
|
+
|
8
|
+
def initialize(json, document)
|
9
|
+
@json = json
|
10
|
+
@document = document
|
11
|
+
end
|
12
|
+
|
13
|
+
def hash
|
14
|
+
{id: id, type: type}.to_json.hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def id
|
18
|
+
json['id']
|
19
|
+
end
|
20
|
+
|
21
|
+
def type
|
22
|
+
json['type']
|
23
|
+
end
|
24
|
+
|
25
|
+
def attributes
|
26
|
+
@attributes ||= RealSavvy::Attributes.new(json['attributes'] || {})
|
27
|
+
end
|
28
|
+
|
29
|
+
def links
|
30
|
+
@links ||= RealSavvy::Links.new(json['links'] || {})
|
31
|
+
end
|
32
|
+
|
33
|
+
def meta
|
34
|
+
@meta ||= RealSavvy::Meta.new(json['meta'] || {})
|
35
|
+
end
|
36
|
+
|
37
|
+
def relationships
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def inspect
|
42
|
+
json.inspect
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.relationships
|
46
|
+
@relationships ||= {}
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.has_one relationship
|
50
|
+
relationships[relationship.to_s] ||= {}
|
51
|
+
relationships[relationship.to_s].merge!(single: true)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.belongs_to relationship
|
55
|
+
has_one relationship
|
56
|
+
end
|
57
|
+
|
58
|
+
# Do nothing default behavior
|
59
|
+
def self.has_many relationship
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def objects_lookup
|
66
|
+
document&.objects_lookup || {}
|
67
|
+
end
|
68
|
+
|
69
|
+
def loaded_relationships
|
70
|
+
@loaded_relationships ||= {}
|
71
|
+
end
|
72
|
+
|
73
|
+
def has_relationship(relationship)
|
74
|
+
possible_relation_ship = json['relationships']&.[](relationship.to_s)
|
75
|
+
possible_relation_ship && possible_relation_ship.length > 0
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_relationship(relationship)
|
79
|
+
relationship_raw = json['relationships']&.[](relationship.to_s)&.[]('data')
|
80
|
+
relationship_processed = ::RealSavvy::Document.process_resources(relationship_raw)
|
81
|
+
end
|
82
|
+
|
83
|
+
def load_relationship_with_lookup(relationship)
|
84
|
+
loaded_relationships[relationship] ||= build_relationship(relationship).map { |resource| objects_lookup[resource.hash] || resource }
|
85
|
+
self.class.relationships[relationship.to_s]&.[](:single) ? loaded_relationships[relationship].first : loaded_relationships[relationship]
|
86
|
+
end
|
87
|
+
|
88
|
+
def method_missing(m, *args, &block)
|
89
|
+
if has_relationship(m)
|
90
|
+
load_relationship_with_lookup(m)
|
91
|
+
else
|
92
|
+
super
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/real_savvy.rb
ADDED
data/real_savvy.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'real_savvy/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'real_savvy'
|
8
|
+
spec.version = RealSavvy::VERSION.join('.')
|
9
|
+
spec.authors = ["Ryan Rauh","Michael Bastos","Andrew Rove"]
|
10
|
+
spec.email = 'andrew@realsavvy.com'
|
11
|
+
|
12
|
+
spec.summary = %q{RealSavvy API Gem}
|
13
|
+
spec.description = %q{A gem for connecting to RealSavvy V3 API}
|
14
|
+
spec.homepage = 'http://rubygems.org/gems/realsavvy'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features|gemfiles)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_runtime_dependency 'faraday', ">= 0.10.0"
|
25
|
+
spec.add_runtime_dependency 'faraday_middleware', ">= 0.10.0"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
30
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: real_savvy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Rauh
|
8
|
+
- Michael Bastos
|
9
|
+
- Andrew Rove
|
10
|
+
autorequire:
|
11
|
+
bindir: exe
|
12
|
+
cert_chain: []
|
13
|
+
date: 2018-02-12 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: faraday
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.10.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 0.10.0
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: faraday_middleware
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.10.0
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.10.0
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: bundler
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.14'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.14'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rake
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '10.0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '10.0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3.0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '3.0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: pry
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.10'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0.10'
|
99
|
+
description: A gem for connecting to RealSavvy V3 API
|
100
|
+
email: andrew@realsavvy.com
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- Gemfile
|
107
|
+
- LICENSE.txt
|
108
|
+
- bin/console
|
109
|
+
- bin/setup
|
110
|
+
- client.rb
|
111
|
+
- lib/real_savvy.rb
|
112
|
+
- lib/real_savvy/adapter.rb
|
113
|
+
- lib/real_savvy/adapter/agent.rb
|
114
|
+
- lib/real_savvy/adapter/agent_profile.rb
|
115
|
+
- lib/real_savvy/adapter/base.rb
|
116
|
+
- lib/real_savvy/adapter/broker_office.rb
|
117
|
+
- lib/real_savvy/adapter/collection.rb
|
118
|
+
- lib/real_savvy/adapter/markets.rb
|
119
|
+
- lib/real_savvy/adapter/open_house.rb
|
120
|
+
- lib/real_savvy/adapter/property.rb
|
121
|
+
- lib/real_savvy/adapter/saved_search.rb
|
122
|
+
- lib/real_savvy/adapter/site.rb
|
123
|
+
- lib/real_savvy/adapter/user.rb
|
124
|
+
- lib/real_savvy/attributes.rb
|
125
|
+
- lib/real_savvy/client.rb
|
126
|
+
- lib/real_savvy/concern.rb
|
127
|
+
- lib/real_savvy/concern/complex_show_for_adapter.rb
|
128
|
+
- lib/real_savvy/concern/create_for_adapter.rb
|
129
|
+
- lib/real_savvy/concern/delegate_to_connection.rb
|
130
|
+
- lib/real_savvy/concern/destroy_for_adapter.rb
|
131
|
+
- lib/real_savvy/concern/index_for_adapter.rb
|
132
|
+
- lib/real_savvy/concern/invites_actions_for_adapter.rb
|
133
|
+
- lib/real_savvy/concern/show_for_adapter.rb
|
134
|
+
- lib/real_savvy/concern/update_for_adapter.rb
|
135
|
+
- lib/real_savvy/connection.rb
|
136
|
+
- lib/real_savvy/document.rb
|
137
|
+
- lib/real_savvy/links.rb
|
138
|
+
- lib/real_savvy/meta.rb
|
139
|
+
- lib/real_savvy/resource.rb
|
140
|
+
- lib/real_savvy/resource/base.rb
|
141
|
+
- lib/real_savvy/resource/collection.rb
|
142
|
+
- lib/real_savvy/resource/property.rb
|
143
|
+
- lib/real_savvy/resource/saved_search.rb
|
144
|
+
- lib/real_savvy/resource/user.rb
|
145
|
+
- lib/real_savvy/version.rb
|
146
|
+
- real_savvy.gemspec
|
147
|
+
homepage: http://rubygems.org/gems/realsavvy
|
148
|
+
licenses:
|
149
|
+
- MIT
|
150
|
+
metadata: {}
|
151
|
+
post_install_message:
|
152
|
+
rdoc_options: []
|
153
|
+
require_paths:
|
154
|
+
- lib
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
165
|
+
requirements: []
|
166
|
+
rubyforge_project:
|
167
|
+
rubygems_version: 2.6.13
|
168
|
+
signing_key:
|
169
|
+
specification_version: 4
|
170
|
+
summary: RealSavvy API Gem
|
171
|
+
test_files: []
|