bing-ads-api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +92 -0
- data/Rakefile +38 -0
- data/lib/bing-ads-api.rb +38 -0
- data/lib/bing-ads-api.yml +345 -0
- data/lib/bing-ads-api/api_exception.rb +42 -0
- data/lib/bing-ads-api/client_proxy.rb +131 -0
- data/lib/bing-ads-api/config.rb +75 -0
- data/lib/bing-ads-api/constants.rb +133 -0
- data/lib/bing-ads-api/data/ad.rb +119 -0
- data/lib/bing-ads-api/data/ad_group.rb +121 -0
- data/lib/bing-ads-api/data/campaign.rb +40 -0
- data/lib/bing-ads-api/data/report_request.rb +78 -0
- data/lib/bing-ads-api/data/report_request_status.rb +48 -0
- data/lib/bing-ads-api/data/reporting/account_performance_report_request.rb +176 -0
- data/lib/bing-ads-api/data/reporting/campaign_performance_report_request.rb +186 -0
- data/lib/bing-ads-api/data/reporting/helpers/column_helper.rb +65 -0
- data/lib/bing-ads-api/data/reporting/helpers/filter_helper.rb +124 -0
- data/lib/bing-ads-api/data/reporting/helpers/scope_helper.rb +51 -0
- data/lib/bing-ads-api/data/reporting/helpers/time_helper.rb +69 -0
- data/lib/bing-ads-api/data/reporting/performance_report_request.rb +78 -0
- data/lib/bing-ads-api/data_object.rb +35 -0
- data/lib/bing-ads-api/fault/ad_api_error.rb +15 -0
- data/lib/bing-ads-api/fault/ad_api_fault_detail.rb +67 -0
- data/lib/bing-ads-api/fault/api_fault_detail.rb +97 -0
- data/lib/bing-ads-api/fault/application_fault.rb +18 -0
- data/lib/bing-ads-api/fault/batch_error.rb +47 -0
- data/lib/bing-ads-api/fault/operation_error.rb +22 -0
- data/lib/bing-ads-api/fault/partial_errors.rb +75 -0
- data/lib/bing-ads-api/service.rb +174 -0
- data/lib/bing-ads-api/service/campaign_management.rb +483 -0
- data/lib/bing-ads-api/service/reporting.rb +101 -0
- data/lib/bing-ads-api/soap_hasheable.rb +143 -0
- data/lib/bing-ads-api/version.rb +6 -0
- data/lib/locales/es.yml +174 -0
- data/lib/tasks/bing-ads-api_tasks.rake +4 -0
- data/test/bing-ads-api_test.rb +134 -0
- data/test/campaign_management_test.rb +463 -0
- data/test/data_object_test.rb +46 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +56 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +29 -0
- data/test/dummy/log/test.log +3264 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/report_request_test.rb +312 -0
- data/test/reporting_test.rb +145 -0
- data/test/test_helper.rb +11 -0
- metadata +205 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module BingAdsApi
|
4
|
+
|
5
|
+
# Public : Generic exception thrown by service classes in BingAdsApi.
|
6
|
+
# Exception of this kind wrap an AdApiFaultDetail or ApiFaultDetail instance
|
7
|
+
# to look over the specific details of the SOAP request fault.
|
8
|
+
#
|
9
|
+
# Author:: jlopezn@neonline.cl
|
10
|
+
#
|
11
|
+
# Example
|
12
|
+
#
|
13
|
+
#
|
14
|
+
#
|
15
|
+
#
|
16
|
+
class ApiException < Exception
|
17
|
+
|
18
|
+
attr_accessor :fault_object
|
19
|
+
|
20
|
+
# Public : Constructor. Based on the default Exception constructor,
|
21
|
+
# adds the fault_object instance, that can be an ApiFaultDetail or
|
22
|
+
# AdApiFaultDetail instance
|
23
|
+
#
|
24
|
+
# === Parameters
|
25
|
+
# * fault_object - AdApiFaultDetail or ApiFaultDetail instance
|
26
|
+
# * msg - optional message
|
27
|
+
#
|
28
|
+
# Author:: jlopezn@neonline.cl
|
29
|
+
def initialize(fault_object, msg=nil)
|
30
|
+
super(msg)
|
31
|
+
self.fault_object = fault_object
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# Public : Specified to string method
|
36
|
+
#
|
37
|
+
# Author:: jlopezn@neonline.cl
|
38
|
+
def to_s
|
39
|
+
super.to_s + " - " + fault_object.to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module BingAdsApi
|
4
|
+
|
5
|
+
# Public : ClientProxy es un objeto para encapsular la conexión y request
|
6
|
+
# de servicios a la API de Bing. En su inicialización requiere los datos
|
7
|
+
# de autenticación y el WSDL al servicio que se requiere.
|
8
|
+
#
|
9
|
+
# Author:: jlopezn@neonline.cl
|
10
|
+
#
|
11
|
+
# Examples
|
12
|
+
# # => hash con datos autenticación y WSDL
|
13
|
+
# options = {
|
14
|
+
# :username => "username",
|
15
|
+
# :password => "password",
|
16
|
+
# :developer_token => "THE_TOKEN",
|
17
|
+
# :customer_id => "123456",
|
18
|
+
# :account_id => "123456",
|
19
|
+
# :wsdl_url => "https://api.sandbox.bingads.microsoft.com/Api/Advertiser/CampaignManagement/v9/CampaignManagementService.svc?singleWsdl"
|
20
|
+
# }
|
21
|
+
# # => Instancia de ClientProxy
|
22
|
+
# client = BingAdsApi::ClientProxy.new(options)
|
23
|
+
# # => Llamada a servicio 'GetCampaignsByAccountId'
|
24
|
+
# response = client.service.call(:get_campaigns_by_account_id,
|
25
|
+
# message: { Account_id: client.account_id})
|
26
|
+
class ClientProxy
|
27
|
+
|
28
|
+
# Public : Namespace para atributos bing. Hace referencia a la versión de API usada
|
29
|
+
NAMESPACE = :v9
|
30
|
+
|
31
|
+
# Public : Case empleado los nombres de atributos en los XML
|
32
|
+
KEYS_CASE = :camelcase
|
33
|
+
|
34
|
+
|
35
|
+
# Atributos del client proxy
|
36
|
+
attr_accessor :username, :password, :developer_token, :wsdl_url, :account_id, :customer_id, :service, :namespace
|
37
|
+
|
38
|
+
# Public : Constructor
|
39
|
+
#
|
40
|
+
# Author:: jlopezn@neonline.cl
|
41
|
+
#
|
42
|
+
# === Parameters
|
43
|
+
# options - Hash con valores de autenticación y WSDL
|
44
|
+
#
|
45
|
+
#
|
46
|
+
# === Options
|
47
|
+
# * username - Bing Ads username
|
48
|
+
# * passwrod - Bing Ads user's sign-in password
|
49
|
+
# * developer_token - client application's developer access token
|
50
|
+
# * customer_id - identifier for the customer that owns the account
|
51
|
+
# * account_id - identifier of the account that own the entities in the request
|
52
|
+
# * wsdl_url - URL for the WSDL to be called
|
53
|
+
# * proxy - Hash with any Savon Client additional options (such as header, logger or enconding)
|
54
|
+
#
|
55
|
+
# === Examples
|
56
|
+
# options = {
|
57
|
+
# :username => "username",
|
58
|
+
# :password => "password",
|
59
|
+
# :developer_token => "THE_TOKEN",
|
60
|
+
# :customer_id => "123456",
|
61
|
+
# :account_id => "123456",
|
62
|
+
# :wsdl_url => "https://api.sandbox.bingads.microsoft.com/Api/Advertiser/CampaignManagement/v9/CampaignManagementService.svc?singleWsdl"
|
63
|
+
# }
|
64
|
+
# # => Instancia de ClientProxy
|
65
|
+
# client = BingAdsApi::ClientProxy.new(options)
|
66
|
+
#
|
67
|
+
# Returns:: ClientProxy instance
|
68
|
+
def initialize(options=nil)
|
69
|
+
if options
|
70
|
+
@username ||= options[:username]
|
71
|
+
@password ||= options[:password]
|
72
|
+
@developer_token ||= options[:developer_token]
|
73
|
+
@wsdl_url ||= options[:wsdl_url]
|
74
|
+
@account_id ||= options[:account_id]
|
75
|
+
@customer_id ||= options[:customer_id]
|
76
|
+
@namespace ||= options[:namespace]
|
77
|
+
end
|
78
|
+
self.service = get_proxy(options[:proxy])
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
# Public : Delegate for Savon::Client.call method
|
83
|
+
#
|
84
|
+
# Author:: jlopezn@neonline.cl
|
85
|
+
#
|
86
|
+
# === Parameters
|
87
|
+
# service_name - Service to be called
|
88
|
+
# message - Message for the service
|
89
|
+
# options - Additional options for the service
|
90
|
+
#
|
91
|
+
# === Examples
|
92
|
+
# client.call_service(:some_service_name, {key: value})
|
93
|
+
# # => <Response>
|
94
|
+
#
|
95
|
+
# Returns:: Response from the Savon::Client
|
96
|
+
# Raises:: Savon::SOAPFault Savon::HTTPError Savon::InvalidResponseError
|
97
|
+
def call(service_name, message, options={})
|
98
|
+
self.service.call(service_name, message)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
private
|
103
|
+
# Internal : Wrapper for Savon client instances
|
104
|
+
#
|
105
|
+
# Author:: jlopezn@neonline.cl
|
106
|
+
#
|
107
|
+
# Examples
|
108
|
+
# get_proxy
|
109
|
+
# # => <Savon::Client>
|
110
|
+
#
|
111
|
+
# Returns:: Savon client instance
|
112
|
+
def get_proxy(client_settings)
|
113
|
+
|
114
|
+
settings = {
|
115
|
+
convert_request_keys_to: KEYS_CASE,
|
116
|
+
wsdl: self.wsdl_url,
|
117
|
+
namespace_identifier: NAMESPACE,
|
118
|
+
soap_header: {
|
119
|
+
"#{NAMESPACE.to_s}:CustomerAccountId" => self.account_id,
|
120
|
+
"#{NAMESPACE.to_s}:CustomerId" => self.customer_id,
|
121
|
+
"#{NAMESPACE.to_s}:DeveloperToken" => self.developer_token,
|
122
|
+
"#{NAMESPACE.to_s}:UserName" => self.username,
|
123
|
+
"#{NAMESPACE.to_s}:Password" => self.password
|
124
|
+
}
|
125
|
+
}
|
126
|
+
settings.merge(client_settings) if client_settings
|
127
|
+
return Savon.client(settings)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module BingAdsApi
|
5
|
+
|
6
|
+
# Public : Helper class for configuration issues like WSDL URLs and constants
|
7
|
+
#
|
8
|
+
# Author:: author@neonline.cl
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
# class_usage
|
12
|
+
# # => class_usage_return
|
13
|
+
class Config
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
# Array with Bing Ads API environments: +sandbox+ and +production+
|
17
|
+
ENVIRONMENTS = ['sandbox', 'production']
|
18
|
+
|
19
|
+
attr_accessor :config
|
20
|
+
@config = YAML.load_file(File.join(File.dirname(__FILE__),"../bing-ads-api.yml"))
|
21
|
+
|
22
|
+
# Public : Constructor
|
23
|
+
#
|
24
|
+
# Author:: jlopezn@neonline.cl
|
25
|
+
def initialize
|
26
|
+
@config = YAML.load_file(File.join(File.dirname(__FILE__),"../bing-ads-api.yml"))
|
27
|
+
end
|
28
|
+
|
29
|
+
# Public : Returns the config file as an Hash instance
|
30
|
+
#
|
31
|
+
# Author:: jlopezn@neonline.cl
|
32
|
+
#
|
33
|
+
# Returns:: Hash
|
34
|
+
def self.hash_instance
|
35
|
+
instance.config
|
36
|
+
end
|
37
|
+
|
38
|
+
## Constants
|
39
|
+
@config['constants'].each do |key, value|
|
40
|
+
|
41
|
+
define_method("#{key.to_s}_constants") do |constant=nil|
|
42
|
+
value[constant.to_s] if constant
|
43
|
+
value
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
# Public : Returns a String with WSDL url for the service indicated
|
50
|
+
#
|
51
|
+
# Author:: jlopezn@neonline.cl
|
52
|
+
#
|
53
|
+
# === Parameters
|
54
|
+
# environment - Bing Environment: 'sandbox' or 'production'
|
55
|
+
# service - service name
|
56
|
+
#
|
57
|
+
# === Examples
|
58
|
+
# config.service_wsdl(:sandbox, :campaign_management)
|
59
|
+
# # => "https://api.sandbox.bingads.microsoft.com/Api/Advertiser/CampaignManagement/v9/CampaignManagementService.svc?singleWsdl"
|
60
|
+
#
|
61
|
+
# Returns:: returns
|
62
|
+
# Raises:: exception
|
63
|
+
def service_wsdl(environment, service)
|
64
|
+
if (ENVIRONMENTS.include?(environment.to_s))
|
65
|
+
if @config['wsdl'][environment.to_s].include?(service.to_s)
|
66
|
+
return @config['wsdl'][environment.to_s][service.to_s]
|
67
|
+
end
|
68
|
+
raise "Unknown service '#{service.to_s}'. Available services: #{@config['wsdl'][environment.to_s].keys.join(", ")}"
|
69
|
+
end
|
70
|
+
raise "Invalid environment: #{environment}. Value should be 'sandbox' or 'production'"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module BingAdsApi
|
4
|
+
|
5
|
+
# Public : Utility class for TimeZones values
|
6
|
+
#
|
7
|
+
# Example
|
8
|
+
# BingAdsApi::TimeZone.SANTIAGO
|
9
|
+
# # => 'Santiago'
|
10
|
+
#
|
11
|
+
# Author:: jlopezn@neonline.cl
|
12
|
+
module TimeZone
|
13
|
+
|
14
|
+
|
15
|
+
BingAdsApi::Config.instance.common_constants['time_zones'].each do |key, value|
|
16
|
+
TimeZone.const_set(key.upcase, value)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# Public : Utility class for AdLanguages values
|
22
|
+
#
|
23
|
+
# Example
|
24
|
+
# BingAdsApi::AdLanguages.SPANISH
|
25
|
+
# # => 'Spanish'
|
26
|
+
# BingAdsApi::AdLanguages.SPANISH_CODE
|
27
|
+
# # => 'ES'
|
28
|
+
#
|
29
|
+
# Author:: jlopezn@neonline.cl
|
30
|
+
module AdLanguage
|
31
|
+
|
32
|
+
BingAdsApi::Config.instance.common_constants['ad_languages'].each do |key, value|
|
33
|
+
if key == 'codes'
|
34
|
+
value.each do |code_key, code_value|
|
35
|
+
AdLanguage.const_set("#{code_key.upcase}_CODE", code_value)
|
36
|
+
end
|
37
|
+
else
|
38
|
+
AdLanguage.const_set(key.upcase, value)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
## Dynamic classes for campaign management constants
|
46
|
+
BingAdsApi::Config.instance.campaign_management_constants.each do |const_key, const_value|
|
47
|
+
|
48
|
+
const_module = Module.new do
|
49
|
+
# Dynamically create Constants classes for each value found
|
50
|
+
const_value.each do |key, value|
|
51
|
+
self.const_set(key.upcase, value)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
BingAdsApi.const_set(const_key.camelize, const_module)
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
# Public : Module for Reporting formats
|
60
|
+
#
|
61
|
+
# Example
|
62
|
+
# BingAdsApi::ReportFormat.CSV
|
63
|
+
# # => 'Csv'
|
64
|
+
#
|
65
|
+
# Author:: jlopezn@neonline.cl
|
66
|
+
module ReportFormat
|
67
|
+
BingAdsApi::Config.instance.reporting_constants['format'].each do |key, value|
|
68
|
+
ReportFormat.const_set(key.upcase, value)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
# Public : Module for Reporting languages
|
74
|
+
#
|
75
|
+
# Example
|
76
|
+
# BingAdsApi::ReportLanguage.ENGLISH
|
77
|
+
# # => 'English'
|
78
|
+
#
|
79
|
+
# Author:: jlopezn@neonline.cl
|
80
|
+
module ReportLanguage
|
81
|
+
BingAdsApi::Config.instance.reporting_constants['language'].each do |key, value|
|
82
|
+
ReportLanguage.const_set(key.upcase, value)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# Public : Module for Reporting languages
|
88
|
+
#
|
89
|
+
# Example
|
90
|
+
# BingAdsApi::ReportAggregation.SUMMARY
|
91
|
+
# # => 'Summary'
|
92
|
+
# BingAdsApi::ReportAggregation.HOURLY
|
93
|
+
# # => 'Hourly'
|
94
|
+
#
|
95
|
+
# Author:: jlopezn@neonline.cl
|
96
|
+
module ReportAggregation
|
97
|
+
BingAdsApi::Config.instance.reporting_constants['aggregation'].each do |key, value|
|
98
|
+
ReportAggregation.const_set(key.upcase, value)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
# Public : Module for Reporting languages
|
104
|
+
#
|
105
|
+
# Example
|
106
|
+
# BingAdsApi::ReportTimePeriods.TODAY
|
107
|
+
# # => 'Today'
|
108
|
+
# BingAdsApi::ReportTimePeriods.LAST_WEEK
|
109
|
+
# # => 'LastWeek'
|
110
|
+
#
|
111
|
+
# Author:: jlopezn@neonline.cl
|
112
|
+
module ReportTimePeriods
|
113
|
+
BingAdsApi::Config.instance.reporting_constants['time_periods'].each do |key, value|
|
114
|
+
ReportTimePeriods.const_set(key.upcase, value)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
## Dynamic classes for reporting constants
|
120
|
+
# BingAdsApi::Config.instance.reporting_constants.each do |const_key, const_value|
|
121
|
+
#
|
122
|
+
# const_module = Module.new do
|
123
|
+
# # Dynamically create Constants classes for each value found
|
124
|
+
# const_value.each do |key, value|
|
125
|
+
# self.const_set(key.upcase, value)
|
126
|
+
# end
|
127
|
+
#
|
128
|
+
# end
|
129
|
+
# BingAdsApi.const_set(const_key.camelize, const_module)
|
130
|
+
#
|
131
|
+
# end
|
132
|
+
|
133
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module BingAdsApi
|
4
|
+
|
5
|
+
##
|
6
|
+
# Public : Defines the base object of an ad.
|
7
|
+
# Do not instantiate this object. Instead you can instantiate the
|
8
|
+
# BingAdsApi::TextAd, BingAdsApi::MobileAd, or BingAdsApi::ProductAd
|
9
|
+
# object that derives from this object.
|
10
|
+
#
|
11
|
+
# Reference: http://msdn.microsoft.com/en-US/library/bing-ads-campaign-management-ad.aspx
|
12
|
+
#
|
13
|
+
# Author:: jlopezn@neonline.cl
|
14
|
+
#
|
15
|
+
class Ad < BingAdsApi::DataObject
|
16
|
+
include BingAdsApi::AdEditorialStatus
|
17
|
+
include BingAdsApi::AdStatus
|
18
|
+
include BingAdsApi::AdType
|
19
|
+
|
20
|
+
|
21
|
+
attr_accessor :id,
|
22
|
+
|
23
|
+
:device_preference,
|
24
|
+
:editorial_status,
|
25
|
+
|
26
|
+
:status,
|
27
|
+
:type
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Public : Defines a text ad.
|
33
|
+
#
|
34
|
+
# Reference: http://msdn.microsoft.com/en-US/library/bing-ads-campaign-management-textad.aspx
|
35
|
+
#
|
36
|
+
# Author:: jlopezn@neonline.cl
|
37
|
+
#
|
38
|
+
class TextAd < BingAdsApi::Ad
|
39
|
+
|
40
|
+
attr_accessor :destination_url,
|
41
|
+
:display_url,
|
42
|
+
:text,
|
43
|
+
:title
|
44
|
+
|
45
|
+
# Public : Specification of DataObject#to_hash method that ads the type attribute based on this specific class
|
46
|
+
#
|
47
|
+
# Author:: jlopezn@neonline.cl
|
48
|
+
#
|
49
|
+
# keys - specifies the keys case
|
50
|
+
#
|
51
|
+
# Returns:: Hash
|
52
|
+
def to_hash(keys = :underscore)
|
53
|
+
hash = super(keys)
|
54
|
+
hash[get_attribute_key("type", keys)] = "Text"
|
55
|
+
return hash
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
##
|
61
|
+
# Public : Defines a mobile ad. A mobile ad is displayed to a user
|
62
|
+
# when the ad is viewed on a low-fi mobile device.
|
63
|
+
#
|
64
|
+
# Reference: http://msdn.microsoft.com/en-US/library/bing-ads-campaign-management-mobilead.aspx
|
65
|
+
#
|
66
|
+
# Author:: jlopezn@neonline.cl
|
67
|
+
#
|
68
|
+
class MobileAd < BingAdsApi::Ad
|
69
|
+
|
70
|
+
attr_accessor :business_name,
|
71
|
+
:destination_url,
|
72
|
+
:display_url,
|
73
|
+
:phone_number,
|
74
|
+
:text,
|
75
|
+
:title
|
76
|
+
|
77
|
+
# Public : Specification of DataObject#to_hash method that ads the type attribute based on this specific class
|
78
|
+
#
|
79
|
+
# Author:: jlopezn@neonline.cl
|
80
|
+
#
|
81
|
+
# keys - specifies the keys case
|
82
|
+
#
|
83
|
+
# Returns:: Hash
|
84
|
+
def to_hash(keys = :underscore)
|
85
|
+
hash = super(keys)
|
86
|
+
hash[get_attribute_key("type", keys)] = "Mobile"
|
87
|
+
return hash
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
##
|
94
|
+
# Public : Defines a product ad.
|
95
|
+
#
|
96
|
+
# Reference: http://msdn.microsoft.com/en-US/library/bing-ads-productad-campaign-management.aspx
|
97
|
+
#
|
98
|
+
# Author:: jlopezn@neonline.cl
|
99
|
+
#
|
100
|
+
class ProductAd < BingAdsApi::Ad
|
101
|
+
|
102
|
+
attr_accessor :promotional_text
|
103
|
+
|
104
|
+
# Public : Specification of DataObject#to_hash method that ads the type attribute based on this specific class
|
105
|
+
#
|
106
|
+
# Author:: jlopezn@neonline.cl
|
107
|
+
#
|
108
|
+
# keys - specifies the keys case
|
109
|
+
#
|
110
|
+
# Returns:: Hash
|
111
|
+
def to_hash(keys = :underscore)
|
112
|
+
hash = super(keys)
|
113
|
+
hash[get_attribute_key("type", keys)] = "Product"
|
114
|
+
return hash
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|