citygrid_api 0.0.5.1 → 0.0.6
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/.sass-cache/c6f2c767b164f077e5b9fb1f18a7886d7c755211/test.scssc +0 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +9 -1
- data/VERSION +1 -1
- data/citygrid_api.gemspec +85 -45
- data/citygrid_api.yml.backup +35 -0
- data/citygrid_api.yml.sample +35 -23
- data/fixtures/vcr_cassettes/AdGroupCriterion_mutate.yml +30 -0
- data/fixtures/vcr_cassettes/AdGroupCriterion_search.yml +35 -0
- data/fixtures/vcr_cassettes/Adding_a_place.yml +33 -0
- data/fixtures/vcr_cassettes/Call_Detail_by_campaign.yml +79 -0
- data/fixtures/vcr_cassettes/Geo.yml +32 -0
- data/fixtures/vcr_cassettes/Getting_an_offer_by_listing_ID.yml +54 -0
- data/fixtures/vcr_cassettes/Import_a_cg_account.yml +54 -0
- data/fixtures/vcr_cassettes/Initiating_a_Details.yml +133 -0
- data/fixtures/vcr_cassettes/Initiating_new_MultiDetails.yml +133 -0
- data/fixtures/vcr_cassettes/Method_of_Payment_mutate.yml +33 -0
- data/fixtures/vcr_cassettes/Method_of_Payment_search.yml +59 -0
- data/fixtures/vcr_cassettes/Mutating_AdGroup_Ads.yml +30 -0
- data/fixtures/vcr_cassettes/Report_summary_daily.yml +60 -0
- data/fixtures/vcr_cassettes/Report_summary_user_actions.yml +36 -0
- data/fixtures/vcr_cassettes/Search_Ad_Group_by_Campaign_Id.yml +31 -0
- data/fixtures/vcr_cassettes/Search_Billing_by_Campaign_Id.yml +30 -0
- data/fixtures/vcr_cassettes/Search_account_manager_by_Campaign_Id.yml +30 -0
- data/fixtures/vcr_cassettes/Searching_AdGroup_Geo.yml +57 -0
- data/fixtures/vcr_cassettes/Searching_budgets.yml +30 -0
- data/fixtures/vcr_cassettes/Searching_categories_by_listing_id.yml +35 -0
- data/fixtures/vcr_cassettes/Searching_categories_by_query.yml +33 -0
- data/fixtures/vcr_cassettes/Upload_an_image_Add_a_preview.yml +31 -0
- data/fixtures/vcr_cassettes/create_campaign.yml +30 -0
- data/fixtures/vcr_cassettes/log_in_a_session.yml +24 -0
- data/fixtures/vcr_cassettes/log_in_a_session_mutate_places.yml +56 -0
- data/fixtures/vcr_cassettes/query_account_type_by_id.yml +30 -0
- data/fixtures/vcr_cassettes/search_for_an_account_by_id.yml +31 -0
- data/fixtures/vcr_cassettes/search_for_an_account_by_name.yml +55 -0
- data/fixtures/vcr_cassettes/searching_for_a_CityGrid_listing.yml +168 -0
- data/fixtures/vcr_cassettes/searching_for_a_special_CityGrid_listing.yml +67 -0
- data/lib/citygrid/abstraction/requestable.rb +1 -0
- data/lib/citygrid/api/accounts/account.rb +17 -0
- data/lib/citygrid/api/accounts/authentication.rb +3 -0
- data/lib/citygrid/api/accounts/method_of_payment.rb +10 -0
- data/lib/citygrid/api/accounts/user.rb +18 -0
- data/lib/citygrid/api/accounts.rb +8 -0
- data/lib/citygrid/api/advertising/account_manager.rb +9 -0
- data/lib/citygrid/api/advertising/ad_group.rb +10 -0
- data/lib/citygrid/api/advertising/ad_group_ad.rb +10 -0
- data/lib/citygrid/api/advertising/ad_group_criterion.rb +10 -0
- data/lib/citygrid/api/advertising/ad_group_geo.rb +10 -0
- data/lib/citygrid/api/advertising/billing.rb +9 -0
- data/lib/citygrid/api/advertising/budget.rb +10 -0
- data/lib/citygrid/api/advertising/call_detail.rb +10 -0
- data/lib/citygrid/api/advertising/campaign.rb +10 -0
- data/lib/citygrid/api/advertising/category.rb +10 -0
- data/lib/citygrid/api/advertising/geolocation.rb +10 -0
- data/lib/citygrid/api/{ad_center → advertising}/image.rb +2 -2
- data/lib/citygrid/api/{ad_center → advertising}/performance.rb +5 -2
- data/lib/citygrid/api/advertising/places.rb +10 -0
- data/lib/citygrid/api/advertising.rb +10 -0
- data/lib/citygrid/api/content/offers.rb +2 -12
- data/lib/citygrid/api/content/places.rb +4 -26
- data/lib/citygrid/api/content.rb +1 -5
- data/lib/citygrid/api/mutatable.rb +15 -0
- data/lib/citygrid/api/searchable.rb +15 -0
- data/lib/citygrid/api.rb +54 -52
- data/lib/citygrid/details.rb +3 -6
- data/lib/citygrid/offers.rb +1 -5
- data/lib/citygrid/search.rb +3 -6
- data/lib/citygrid/session.rb +65 -0
- data/lib/citygrid.rb +46 -75
- data/lib/request_ext.rb +4 -5
- data/lib/string_ext.rb +7 -0
- data/test/api/accounts/test_account.rb +111 -0
- data/test/api/accounts/test_method_of_payment.rb +50 -0
- data/test/api/advertising/test_account_manager.rb +14 -0
- data/test/api/advertising/test_ad_group.rb +13 -0
- data/test/api/advertising/test_ad_group_ad.rb +24 -0
- data/test/api/advertising/test_ad_group_criterion.rb +47 -0
- data/test/api/{ad_center → advertising}/test_ad_group_geo.rb +1 -1
- data/test/api/{ad_center → advertising}/test_billing.rb +4 -3
- data/test/api/{ad_center → advertising}/test_budget.rb +3 -3
- data/test/api/{ad_center → advertising}/test_call_detail.rb +5 -11
- data/test/api/{ad_center → advertising}/test_category.rb +9 -12
- data/test/api/advertising/test_create_campaign_and_ad_group.rb +56 -0
- data/test/api/{ad_center → advertising}/test_geolocation.rb +1 -1
- data/test/api/{ad_center → advertising}/test_image.rb +1 -3
- data/test/api/{ad_center/test_reports.rb → advertising/test_performance.rb} +6 -10
- data/test/api/advertising/test_places.rb +109 -0
- data/test/{test_details.rb → api/content/test_details.rb} +2 -3
- data/test/{test_search.rb → api/content/test_search.rb} +2 -2
- data/test/auth_token.rb +39 -0
- data/test/helper.rb +31 -31
- data/test/session_helper.rb +20 -0
- data/test/test_session.rb +53 -0
- metadata +115 -67
- data/lib/citygrid/api/ad_center/account.rb +0 -26
- data/lib/citygrid/api/ad_center/account_manager.rb +0 -8
- data/lib/citygrid/api/ad_center/ad_group.rb +0 -8
- data/lib/citygrid/api/ad_center/ad_group_ad.rb +0 -8
- data/lib/citygrid/api/ad_center/ad_group_criterion.rb +0 -8
- data/lib/citygrid/api/ad_center/ad_group_geo.rb +0 -8
- data/lib/citygrid/api/ad_center/authentication.rb +0 -20
- data/lib/citygrid/api/ad_center/billing.rb +0 -8
- data/lib/citygrid/api/ad_center/budget.rb +0 -9
- data/lib/citygrid/api/ad_center/call_detail.rb +0 -25
- data/lib/citygrid/api/ad_center/campaign.rb +0 -8
- data/lib/citygrid/api/ad_center/category.rb +0 -9
- data/lib/citygrid/api/ad_center/geolocation.rb +0 -9
- data/lib/citygrid/api/ad_center/method_of_payment.rb +0 -10
- data/lib/citygrid/api/ad_center/places.rb +0 -8
- data/lib/citygrid/api/ad_center/user.rb +0 -8
- data/lib/citygrid/api/ad_center.rb +0 -20
- data/lib/citygrid/api/content/places/detail.rb +0 -11
- data/lib/citygrid/api/content/places/search.rb +0 -11
- data/test/api/ad_center/test_account.rb +0 -120
- data/test/api/ad_center/test_ad_group.rb +0 -50
- data/test/api/ad_center/test_ad_group_ad.rb +0 -27
- data/test/api/ad_center/test_ad_group_criterion.rb +0 -37
- data/test/api/ad_center/test_authentication.rb +0 -22
- data/test/api/ad_center/test_campaign.rb +0 -27
- data/test/api/ad_center/test_method_of_payment.rb +0 -51
- data/test/api/ad_center/test_places.rb +0 -79
- data/test/api/content/test_places.rb +0 -66
@@ -2,18 +2,8 @@ class CityGrid
|
|
2
2
|
class API
|
3
3
|
class Content
|
4
4
|
class Offers < Content
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def self.where options = {}
|
9
|
-
endpoint "#{@base_endpoint}/where"
|
10
|
-
request_with_publisher options
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.places options = {}
|
14
|
-
endpoint "#{@base_endpoint}/places"
|
15
|
-
request_with_publisher options
|
16
|
-
end
|
5
|
+
define_action :where, :get, "search/where", :auth_token => false, :publisher => true, :client_ip => true
|
6
|
+
define_action :places, :get, "search/places", :auth_token => false, :publisher => true, :client_ip => true
|
17
7
|
end
|
18
8
|
end
|
19
9
|
end
|
@@ -2,35 +2,13 @@ class CityGrid
|
|
2
2
|
class API
|
3
3
|
class Content
|
4
4
|
class Places < Content
|
5
|
-
|
6
|
-
endpoint "/content/places/v2"
|
5
|
+
extend CityGrid::API::Mutatable
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
Detail.request opts
|
11
|
-
end
|
12
|
-
|
13
|
-
def search opts
|
14
|
-
Search.request opts
|
15
|
-
end
|
16
|
-
|
17
|
-
def mutate options = {}
|
18
|
-
token = extract_auth_token options
|
19
|
-
request_and_handle :post,
|
20
|
-
"#{endpoint}/mutate",
|
21
|
-
:body => options.to_json,
|
22
|
-
:headers => merge_headers("authToken" => token)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
7
|
+
define_action :detail, :get, "detail", :auth_token => false, :publisher => true, :client_ip => true
|
8
|
+
define_action :search, :get, "search/where", :auth_token => false, :publisher => true, :client_ip => true
|
26
9
|
end
|
27
10
|
end
|
28
11
|
end
|
29
12
|
end
|
30
13
|
|
31
|
-
[
|
32
|
-
"detail", "search"
|
33
|
-
].each do |x|
|
34
|
-
require "citygrid/api/content/places/#{x}"
|
35
|
-
end
|
36
|
-
|
14
|
+
Dir[File.dirname(__FILE__) + '/places/*.rb'].each {|file| require file }
|
data/lib/citygrid/api/content.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# /mutate endpoint
|
2
|
+
|
3
|
+
class CityGrid
|
4
|
+
class API
|
5
|
+
module Mutatable
|
6
|
+
def mutate options = {}
|
7
|
+
token = extract_auth_token options
|
8
|
+
request_and_handle :post,
|
9
|
+
"#{endpoint}/mutate",
|
10
|
+
:body => options.to_json,
|
11
|
+
:headers => merge_headers("authToken" => token)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# /get endpoint
|
2
|
+
|
3
|
+
class CityGrid
|
4
|
+
class API
|
5
|
+
module Searchable
|
6
|
+
def search options = {}
|
7
|
+
token = extract_auth_token options
|
8
|
+
request_and_handle :get,
|
9
|
+
"#{endpoint}/get",
|
10
|
+
:query => options,
|
11
|
+
:headers => merge_headers("authToken" => token)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/citygrid/api.rb
CHANGED
@@ -7,69 +7,72 @@ class CityGrid
|
|
7
7
|
format :json
|
8
8
|
#debug_output $stderr
|
9
9
|
|
10
|
+
DEFAULT_HEADERS = {
|
11
|
+
"Accept" => "application/json",
|
12
|
+
"Content-Type" => "Application/JSON"}
|
13
|
+
|
14
|
+
DEFAULT_DEFINE_OPTIONS = {
|
15
|
+
:auth_token => false,
|
16
|
+
:format => true,
|
17
|
+
:publisher => false,
|
18
|
+
:client_ip => false
|
19
|
+
}
|
20
|
+
|
10
21
|
class << self
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
22
|
+
def define_action name, method, action, define_options = {}
|
23
|
+
# options:
|
24
|
+
# auth_token: pass along auth_token
|
25
|
+
# publisher: pass CityGrid.publisher, currently needed for content APIs
|
26
|
+
# ip: pass IP, needed for content
|
27
|
+
# format: pass JSON flag
|
28
|
+
|
29
|
+
define_options = DEFAULT_DEFINE_OPTIONS.merge define_options
|
30
|
+
|
31
|
+
define_singleton_method name.intern do |*args|
|
32
|
+
options = args.first.clone || {}
|
33
|
+
params = {}
|
34
|
+
|
35
|
+
token = options.delete :token
|
36
|
+
|
37
|
+
headers = API::DEFAULT_HEADERS.clone
|
38
|
+
|
39
|
+
headers.merge! "authToken" => token if define_options[:auth_token]
|
16
40
|
|
17
|
-
|
18
|
-
|
19
|
-
|
41
|
+
options.merge! "format" => "json" if define_options[:format]
|
42
|
+
options.merge! "publisher" => CityGrid.publisher if define_options[:publisher]
|
43
|
+
options.merge! "client_ip" => "192.168.0.1" if define_options[:client_ip]
|
44
|
+
|
45
|
+
params[:headers] = headers
|
46
|
+
|
47
|
+
case method
|
48
|
+
when :post
|
49
|
+
params[:body] = options.to_json
|
50
|
+
when :get
|
51
|
+
params[:query] = options
|
52
|
+
end
|
53
|
+
|
54
|
+
request_and_handle method.intern, "#{endpoint}/#{action}", params
|
55
|
+
end
|
20
56
|
end
|
21
|
-
|
22
|
-
def endpoint val=nil
|
57
|
+
|
58
|
+
def endpoint val = nil
|
23
59
|
return @endpoint unless val
|
24
60
|
@endpoint = val
|
25
61
|
end
|
26
62
|
|
27
|
-
def publisher
|
28
|
-
CityGrid.publisher
|
29
|
-
end
|
30
|
-
|
31
63
|
def request options = {}
|
32
64
|
method = (options.delete(:method) || :get).to_sym
|
33
65
|
query = options.merge :format => :json
|
34
66
|
request_and_handle method, endpoint, :query => query
|
35
67
|
end
|
36
68
|
|
37
|
-
def request_with_publisher options = {}
|
38
|
-
request options.merge(:publisher => publisher)
|
39
|
-
end
|
40
|
-
|
41
|
-
def mutate options = {}
|
42
|
-
token = extract_auth_token options
|
43
|
-
request_and_handle :post,
|
44
|
-
"#{endpoint}/mutate",
|
45
|
-
:body => options.to_json,
|
46
|
-
:headers => merge_headers("authToken" => token)
|
47
|
-
end
|
48
|
-
|
49
|
-
def search options = {}
|
50
|
-
token = extract_auth_token options
|
51
|
-
request_and_handle :get,
|
52
|
-
"#{endpoint}/get",
|
53
|
-
:query => options,
|
54
|
-
:headers => merge_headers("authToken" => token)
|
55
|
-
end
|
56
|
-
|
57
69
|
private
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
def merge_headers options = {}
|
63
|
-
{"Accept" => "application/json",
|
64
|
-
"Content-Type" => "Application/JSON"}.merge options
|
70
|
+
def extract_auth_token options = {}
|
71
|
+
options.delete(:token) #|| raise(MissingAuthToken)
|
65
72
|
end
|
66
|
-
|
67
|
-
def
|
68
|
-
|
69
|
-
key = URI.escape k.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
|
70
|
-
val = URI.escape v.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
|
71
|
-
!value.empty? && !key.empty? ? "#{key}=#{value}" : nil
|
72
|
-
end.compact.join("&")
|
73
|
+
|
74
|
+
def merge_headers options = {}
|
75
|
+
DEFAULT_HEADERS.merge options
|
73
76
|
end
|
74
77
|
|
75
78
|
HTTP_METHODS = {
|
@@ -90,7 +93,6 @@ class CityGrid
|
|
90
93
|
end
|
91
94
|
|
92
95
|
req_options = default_options.dup
|
93
|
-
req_options = req_options.merge({:base_uri => CityGrid.config[server]}) if !base_uri && server
|
94
96
|
req_options = req_options.merge(options)
|
95
97
|
|
96
98
|
req = HTTParty::Request.new http_method, path, req_options
|
@@ -100,10 +102,10 @@ class CityGrid
|
|
100
102
|
response = req.perform
|
101
103
|
rescue => ex
|
102
104
|
puts "Something went wrong with Request.perform"
|
103
|
-
error =
|
105
|
+
error = ex
|
104
106
|
rescue Psych::SyntaxError => ex
|
105
107
|
puts "Something went wrong with Request.perform, Psych:SyntaxError"
|
106
|
-
error =
|
108
|
+
error = ex
|
107
109
|
end
|
108
110
|
|
109
111
|
if defined?(Rails.logger)
|
@@ -124,7 +126,7 @@ class CityGrid
|
|
124
126
|
|
125
127
|
if error
|
126
128
|
puts "an error happened"
|
127
|
-
|
129
|
+
ap error
|
128
130
|
#raise error
|
129
131
|
end
|
130
132
|
end
|
data/lib/citygrid/details.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
class CityGrid
|
2
2
|
module DetailsMethods
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def request opts = {}
|
8
|
-
api.request_with_publisher opts.merge(:client_ip => "192.168.0.1")
|
3
|
+
|
4
|
+
def request options = {}
|
5
|
+
CityGrid::API::Content::Places.detail options
|
9
6
|
end
|
10
7
|
end
|
11
8
|
|
data/lib/citygrid/offers.rb
CHANGED
data/lib/citygrid/search.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
class CityGrid
|
2
2
|
class Search < Abstraction::Collection
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def request opts = {}
|
8
|
-
api.request_with_publisher opts
|
3
|
+
|
4
|
+
def request options = {}
|
5
|
+
CityGrid::API::Content::Places.search options
|
9
6
|
end
|
10
7
|
|
11
8
|
private
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class CityGrid
|
2
|
+
class Session
|
3
|
+
class APIAccessor
|
4
|
+
attr_accessor :session
|
5
|
+
|
6
|
+
def initialize session
|
7
|
+
self.session = session
|
8
|
+
end
|
9
|
+
|
10
|
+
def content klass
|
11
|
+
end
|
12
|
+
|
13
|
+
def ad_center klass
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :username, :auth_token, :logged_in, :api
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
self.logged_in = false
|
21
|
+
self.api = {:ad_center => 1, :content => 2}
|
22
|
+
end
|
23
|
+
|
24
|
+
def logged_in?
|
25
|
+
self.logged_in == true
|
26
|
+
end
|
27
|
+
|
28
|
+
def login username, password
|
29
|
+
res = CityGrid::API::Accounts::Authentication.login :username => username, :password => password
|
30
|
+
self.username = username
|
31
|
+
|
32
|
+
case res.code
|
33
|
+
when 201
|
34
|
+
self.auth_token = res.authToken
|
35
|
+
self.logged_in = true
|
36
|
+
# puts "logged in ok"
|
37
|
+
when 400
|
38
|
+
# puts "error"
|
39
|
+
else
|
40
|
+
# puts "unexpected response code"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def call_api klass, action, options = {}
|
45
|
+
klass.send action, options.merge(:token => self.auth_token)
|
46
|
+
end
|
47
|
+
|
48
|
+
class << self
|
49
|
+
def login username, password
|
50
|
+
session = Session.new
|
51
|
+
session.login username, password
|
52
|
+
|
53
|
+
session
|
54
|
+
end
|
55
|
+
|
56
|
+
def from_auth_token auth_token
|
57
|
+
session = Session.new
|
58
|
+
session.auth_token = auth_token
|
59
|
+
session.logged_in = true
|
60
|
+
|
61
|
+
session
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/citygrid.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
# Ruby 1.8.7 doesn't have YAML::ENGINE, this should take care of both cases
|
3
3
|
YAML::ENGINE.yamler= 'syck' if defined?(YAML::ENGINE)
|
4
4
|
|
5
|
+
# load monkey patches
|
6
|
+
require "string_ext"
|
7
|
+
require "request_ext"
|
8
|
+
|
5
9
|
class CityGrid
|
6
10
|
class << self
|
7
11
|
def publisher= code
|
@@ -28,13 +32,18 @@ class CityGrid
|
|
28
32
|
def reviews opts
|
29
33
|
Reviews.new opts
|
30
34
|
end
|
31
|
-
|
35
|
+
|
36
|
+
def session username, password
|
37
|
+
Session.login username, password
|
38
|
+
end
|
39
|
+
|
32
40
|
def authenticate params
|
33
|
-
API::
|
41
|
+
API::Accounts::User.login params
|
34
42
|
end
|
35
43
|
alias_method :login, :authenticate
|
36
44
|
|
37
|
-
#
|
45
|
+
# load in configs
|
46
|
+
# see citygrid_api.yml.sample for format
|
38
47
|
def load_config file_path, env = nil
|
39
48
|
config = YAML.load_file(file_path)
|
40
49
|
|
@@ -42,58 +51,36 @@ class CityGrid
|
|
42
51
|
|
43
52
|
default_hostname = "http://#{defaults["hostname"]}"
|
44
53
|
ssl_hostname = "https://#{defaults["ssl_hostname"]}"
|
45
|
-
|
46
|
-
config["endpoints"].each do |k, v|
|
47
|
-
# camelcase classname
|
48
|
-
classname = k.gsub(/(_(.))/) { $2.upcase}.gsub(/^(.)/) { $1.upcase }
|
49
|
-
klass = API::AdCenter.const_get(classname)
|
50
|
-
if v.is_a? String
|
51
|
-
endpoint = v.start_with?("/") ? v : "/#{v}"
|
52
|
-
klass.endpoint endpoint
|
53
|
-
klass.base_uri default_hostname
|
54
|
-
elsif v.is_a? Hash
|
55
|
-
hostname = v["hostname"] || (v["ssl"] ? ssl_hostname : default_hostname)
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
def config
|
67
|
-
raise EndpointsNotConfigured unless @config && !@config.nil?
|
68
|
-
@config
|
69
|
-
end
|
70
|
-
|
71
|
-
def set_endpoints config_file
|
72
|
-
File.open config_file, "r" do |file|
|
73
|
-
while line = file.gets
|
74
|
-
api, endpoint = line.split("=").map{|x| x.chomp}
|
75
|
-
endpoint = "/#{endpoint}" unless endpoint.start_with?("/")
|
76
|
-
klass = CLASS_MAPPING[api]
|
77
|
-
next unless klass
|
55
|
+
config["api"].each do |n, endpoints|
|
56
|
+
# namespace would be ad_center or content
|
57
|
+
namespace = API.const_get n.camelcase
|
58
|
+
|
59
|
+
endpoints.each do |k, v|
|
60
|
+
# camelcase classname
|
61
|
+
klass = namespace.const_get(k.camelcase)
|
78
62
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
63
|
+
if v.is_a? String
|
64
|
+
# if value is a plain String, that's the endpoint
|
65
|
+
endpoint = v.start_with?("/") ? v : "/#{v}"
|
66
|
+
klass.endpoint endpoint
|
67
|
+
klass.base_uri default_hostname
|
68
|
+
elsif v.is_a? Hash
|
69
|
+
# if value is a Hash, fetch endpoint
|
70
|
+
# if hostname is set, use it
|
71
|
+
# otherwise if ssl is set then use ssl_hostname. fallback to default_hostname
|
72
|
+
hostname = v["hostname"] || (v["ssl"] ? ssl_hostname : default_hostname)
|
73
|
+
endpoint = v["endpoint"].start_with?("/") ? v["endpoint"] : "/#{v["endpoint"]}"
|
74
|
+
klass.endpoint endpoint
|
75
|
+
klass.base_uri hostname
|
76
|
+
else
|
77
|
+
# should not get here. value should be String or Hash
|
78
|
+
end
|
91
79
|
|
92
|
-
klass.base_uri
|
80
|
+
# puts "#{klass.name} => #{klass.base_uri} : #{klass.endpoint}"
|
93
81
|
end
|
94
82
|
end
|
95
83
|
end
|
96
|
-
|
97
84
|
end
|
98
85
|
|
99
86
|
# Errors
|
@@ -106,45 +93,29 @@ class CityGrid
|
|
106
93
|
|
107
94
|
class EndpointsNotConfigured < StandardError
|
108
95
|
def initialize
|
109
|
-
super "
|
96
|
+
super "Endpoint is not properly configured. Run 'CityGrid.load_config'"
|
110
97
|
end
|
111
98
|
end
|
112
99
|
end
|
113
100
|
|
114
101
|
require "citygrid/abstraction"
|
115
102
|
require "citygrid/api"
|
103
|
+
require "yaml"
|
104
|
+
|
105
|
+
require "citygrid/api/mutatable"
|
106
|
+
require "citygrid/api/searchable"
|
116
107
|
|
117
108
|
require "citygrid/search"
|
118
109
|
require "citygrid/reviews"
|
119
110
|
require "citygrid/offers"
|
120
111
|
require "citygrid/details"
|
121
112
|
require "citygrid/listing"
|
113
|
+
require "citygrid/session"
|
122
114
|
|
123
115
|
require "citygrid/api/response"
|
124
|
-
require "citygrid/api/ad_center"
|
125
|
-
require "citygrid/api/content"
|
126
116
|
|
127
|
-
require "
|
117
|
+
require "citygrid/api/accounts"
|
118
|
+
require "citygrid/api/advertising"
|
119
|
+
require "citygrid/api/content"
|
128
120
|
|
129
|
-
|
130
|
-
CLASS_MAPPING = {
|
131
|
-
"account" => CityGrid::API::AdCenter::Account,
|
132
|
-
"accountmanager" => CityGrid::API::AdCenter::AccountManager,
|
133
|
-
"adgroup" => CityGrid::API::AdCenter::AdGroup,
|
134
|
-
"adgroupad" => CityGrid::API::AdCenter::AdGroupAd,
|
135
|
-
"adgroupgeo" => CityGrid::API::AdCenter::AdGroupGeo,
|
136
|
-
"billing" => CityGrid::API::AdCenter::Billing,
|
137
|
-
"adgroupcriterion" => CityGrid::API::AdCenter::AdGroupCriterion,
|
138
|
-
"authentication" => CityGrid::API::AdCenter::Authentication,
|
139
|
-
"budget" => CityGrid::API::AdCenter::Budget,
|
140
|
-
"campaign" => CityGrid::API::AdCenter::Campaign,
|
141
|
-
"category" => CityGrid::API::AdCenter::Category,
|
142
|
-
"geolocation" => CityGrid::API::AdCenter::GeoLocation,
|
143
|
-
"mop" => CityGrid::API::AdCenter::MethodOfPayment,
|
144
|
-
"image" => CityGrid::API::AdCenter::Image,
|
145
|
-
"places" => CityGrid::API::AdCenter::Places,
|
146
|
-
"performance" => CityGrid::API::AdCenter::Performance,
|
147
|
-
# "reviews" => CityGrid::API::AdCenter::Reviews
|
148
|
-
"user" => CityGrid::API::AdCenter::User
|
149
|
-
}
|
150
|
-
end
|
121
|
+
require "request_ext"
|
data/lib/request_ext.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
module HTTParty
|
2
2
|
class Request
|
3
3
|
|
4
|
+
# HTTParty::Request does some weird things with url params (namely, repeating them)
|
5
|
+
# use last_uri if it exists
|
4
6
|
def get_uri
|
5
|
-
|
6
|
-
return last_uri
|
7
|
-
else
|
8
|
-
return uri
|
9
|
-
end
|
7
|
+
(self.respond_to?('last_uri') && last_uri) ? last_uri : uri
|
10
8
|
end
|
11
9
|
|
10
|
+
# monkey patch to_json and to_curl methods into Request
|
12
11
|
def to_json
|
13
12
|
{
|
14
13
|
"requestUrl" => get_uri,
|