adapi 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -31,6 +31,8 @@ require 'adapi/constant_data/language'
31
31
  require 'adapi/constant_data/country'
32
32
  require 'adapi/constant_data/province'
33
33
  require 'adapi/location'
34
+ require 'adapi/managed_customer'
35
+ require 'adapi/budget_order'
34
36
 
35
37
  # monkeypatch that hardcodes HTTP timeout to 5 minutes
36
38
  require 'httpi_monkeypatch'
@@ -0,0 +1,113 @@
1
+ #
2
+ # Provides interface over BudgetOrderService
3
+ # Runs on the Adwords API v201206-later
4
+ #
5
+ #
6
+ module Adapi
7
+ class BudgetOrder < Api # == BudgetOrderService
8
+
9
+ # PS: id is only read only-value
10
+ ATTRIBUTES = [ :billing_account_id, :id, :spending_limit, :start_date_time, :end_date_time ]
11
+
12
+ attr_accessor *ATTRIBUTES
13
+
14
+ def attributes
15
+ super.merge Hash[ ATTRIBUTES.map { |k| [k, self.send(k)] } ]
16
+ end
17
+
18
+ alias to_hash attributes
19
+
20
+ # these fields are required for ADD operation
21
+ validates_presence_of :billing_account_id, :spending_limit, :start_date_time, :end_date_time
22
+
23
+ def initialize(params = {})
24
+ params.symbolize_keys!
25
+
26
+ params[:service_name] = :BudgetOrderService
27
+
28
+ @xsi_type = 'BudgetOrder'
29
+
30
+ ATTRIBUTES.each do |param_name|
31
+ self.send("#{param_name}=", params[param_name])
32
+ end
33
+
34
+ super(params)
35
+ end
36
+
37
+ def create
38
+ return false unless self.valid?
39
+
40
+ operand = {
41
+ :billing_account_id => self.send(:billing_account_id),
42
+ :start_date_time => fix_time(self.send(:start_date_time)),
43
+ :end_date_time => fix_time(self.send(:end_date_time))
44
+ }
45
+
46
+ if self.send(:spending_limit).is_a?(Hash)
47
+ operand[:spending_limit] = self.send(:spending_limit)
48
+ else
49
+ operand[:spending_limit] = { micro_amount: Api.to_micro_units(self.send(:spending_limit)) }
50
+ end
51
+
52
+ response = self.mutate(
53
+ operator: 'ADD',
54
+ operand: operand
55
+ )
56
+
57
+ check_for_errors(self)
58
+
59
+ self.id = response[:value].first[:id] rescue nil
60
+ end
61
+
62
+ def update(params = {})
63
+ return false unless self.valid?
64
+
65
+ operand = {
66
+ :id => self.send(:id),
67
+ :billing_account_id => self.send(:billing_account_id),
68
+ :start_date_time => fix_time(self.send(:start_date_time)),
69
+ :end_date_time => fix_time(self.send(:end_date_time))
70
+ }
71
+
72
+ if self.send(:spending_limit).is_a?(Hash)
73
+ operand[:spending_limit] = self.send(:spending_limit)
74
+ else
75
+ operand[:spending_limit] = { micro_amount: Api.to_micro_units(self.send(:spending_limit)) }
76
+ end
77
+
78
+ response = self.mutate(
79
+ operator: 'SET',
80
+ operand: operand
81
+ )
82
+
83
+ check_for_errors(self)
84
+ end
85
+
86
+ def self.find
87
+
88
+ select_fields = [
89
+ :billing_account_id,
90
+ :id,
91
+ :spending_limit,
92
+ :start_date_time,
93
+ :end_date_time
94
+ ].collect{|f| f.to_s.camelize }
95
+
96
+ selector = {
97
+ :fields => select_fields,
98
+ :ordering => [],
99
+ :predicates => []
100
+ }
101
+
102
+ response = BudgetOrder.new.service.get(selector)
103
+
104
+ response[:entries].collect{|e| BudgetOrder.new(e)}
105
+ end
106
+
107
+ # TODO this is potentially brittle. update and add tests
108
+ def fix_time(a_time)
109
+ Time.parse(a_time.to_s).strftime("%Y%m%d %H%M%S Europe/Prague")
110
+ end
111
+
112
+ end
113
+ end
@@ -0,0 +1,102 @@
1
+ #
2
+ # Provides interface over ManagedCustomerService (formerly ServicedAccountService).
3
+ # Runs on the Adwords API v201206
4
+ #
5
+ # This model use :customer_id instead of :id
6
+ #
7
+ module Adapi
8
+ class ManagedCustomer < Api # == Account
9
+
10
+ # PS: lots of these attributes are read-only
11
+ ATTRIBUTES = [ :name, :login, :company_name, :customer_id,
12
+ :can_manage_clients, :currency_code, :date_time_zone ]
13
+
14
+ attr_accessor *ATTRIBUTES
15
+
16
+ def attributes
17
+ super.merge Hash[ ATTRIBUTES.map { |k| [k, self.send(k)] } ]
18
+ end
19
+
20
+ alias to_hash attributes
21
+
22
+ # these fields are required for ADD operation
23
+ validates_presence_of :name, :currency_code, :date_time_zone
24
+
25
+ def initialize(params = {})
26
+ params.symbolize_keys!
27
+
28
+ params[:service_name] = :ManagedCustomerService
29
+
30
+ # this model uses the latest version of AdWords API.
31
+ # the rest of the model still use v201109_1
32
+ params[:api_version] = :v201206
33
+
34
+ @xsi_type = 'ManagedCustomer'
35
+
36
+ ATTRIBUTES.each do |param_name|
37
+ self.send("#{param_name}=", params[param_name])
38
+ end
39
+
40
+ super(params)
41
+ end
42
+
43
+ def create
44
+ return false unless self.valid?
45
+
46
+ operand = Hash[
47
+ [ :name, :currency_code, :date_time_zone ].map do |k|
48
+ [ k.to_sym, self.send(k) ] if self.send(k)
49
+ end.compact
50
+ ]
51
+
52
+ response = self.mutate(
53
+ operator: 'ADD',
54
+ operand: operand
55
+ )
56
+
57
+ check_for_errors(self)
58
+
59
+ self.id = self.customer_id = response[:value].first[:customer_id] rescue nil
60
+ end
61
+
62
+ def self.find(amount = :first, params = {})
63
+ # find single campaign by id
64
+ if params.empty? and not amount.is_a?(Symbol)
65
+ params[:customer_id] = amount.to_i
66
+ amount = :first
67
+ end
68
+
69
+ params.symbolize_keys!
70
+ first_only = (amount.to_sym == :first)
71
+
72
+ # create predicate from supported search parameters
73
+ predicates = [ :name, :customer_id, :currency_code ].map do |param_name|
74
+ if params[param_name]
75
+ { :field => param_name.to_s.camelcase, :operator => 'IN', :values => Array( params[param_name] ) }
76
+ end
77
+ end.compact
78
+
79
+ # REFACTOR take fields from attributes using some common method
80
+ select_fields = %w{ Name Login companyName customerId
81
+ canManageClients currencyCode dateTimeZone }
82
+
83
+ selector = {
84
+ :fields => select_fields,
85
+ # :ordering => [ { field: 'Name', sort_order: 'ASCENDING' } ],
86
+ :predicates => predicates
87
+ }
88
+
89
+ response = ManagedCustomer.new.service.get(selector)
90
+
91
+ response = (response and response[:entries]) ? response[:entries] : []
92
+
93
+ # response.map! do |data|
94
+ # ManagedCustomer.new(data.merge( :customer_id => data[:customer_id] )
95
+ # TextAd.new(data[:ad].merge(:ad_group_id => data[:ad_group_id], :status => data[:status]))
96
+ # end
97
+
98
+ first_only ? response.first : response
99
+ end
100
+
101
+ end
102
+ end
@@ -1,10 +1,14 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Adapi
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
 
6
6
  # CHANGELOG:
7
7
  #
8
+ # 0.1.3
9
+ # added ManagedAccount service
10
+ # added BudgetOrder service
11
+ #
8
12
  # 0.1.2
9
13
  # fixed bug in campaign.update
10
14
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-10 00:00:00.000000000 Z
12
+ date: 2012-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-ads-common
16
- requirement: &25840920 !ruby/object:Gem::Requirement
16
+ requirement: &6620560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.8.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *25840920
24
+ version_requirements: *6620560
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: google-adwords-api
27
- requirement: &25840080 !ruby/object:Gem::Requirement
27
+ requirement: &6682040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.7.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *25840080
35
+ version_requirements: *6682040
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activemodel
38
- requirement: &25839320 !ruby/object:Gem::Requirement
38
+ requirement: &6680220 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *25839320
46
+ version_requirements: *6680220
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activesupport
49
- requirement: &25838320 !ruby/object:Gem::Requirement
49
+ requirement: &6678920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *25838320
57
+ version_requirements: *6678920
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &25837080 !ruby/object:Gem::Requirement
60
+ requirement: &6772420 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.9.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *25837080
68
+ version_requirements: *6772420
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: curb
71
- requirement: &25836240 !ruby/object:Gem::Requirement
71
+ requirement: &6771360 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.8.1
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *25836240
79
+ version_requirements: *6771360
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yard
82
- requirement: &25835200 !ruby/object:Gem::Requirement
82
+ requirement: &6769980 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0.8'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *25835200
90
+ version_requirements: *6769980
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rcov
93
- requirement: &25850680 !ruby/object:Gem::Requirement
93
+ requirement: &6768620 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0.9'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *25850680
101
+ version_requirements: *6768620
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: turn
104
- requirement: &25849960 !ruby/object:Gem::Requirement
104
+ requirement: &6767140 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.9.6
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *25849960
112
+ version_requirements: *6767140
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: shoulda
115
- requirement: &25849260 !ruby/object:Gem::Requirement
115
+ requirement: &6765820 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '3.1'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *25849260
123
+ version_requirements: *6765820
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: fakeweb
126
- requirement: &25848340 !ruby/object:Gem::Requirement
126
+ requirement: &6764740 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '1.3'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *25848340
134
+ version_requirements: *6764740
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: factory_girl
137
- requirement: &25847740 !ruby/object:Gem::Requirement
137
+ requirement: &6777260 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '3.3'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *25847740
145
+ version_requirements: *6777260
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: minitest
148
- requirement: &25847240 !ruby/object:Gem::Requirement
148
+ requirement: &7181560 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,7 +153,7 @@ dependencies:
153
153
  version: '3.3'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *25847240
156
+ version_requirements: *7181560
157
157
  description: This gem provides user-friendly interface to Google Adwords API.
158
158
  email:
159
159
  - lucastej@gmail.com
@@ -208,6 +208,7 @@ files:
208
208
  - lib/adapi/ad_group_criterion.rb
209
209
  - lib/adapi/ad_param.rb
210
210
  - lib/adapi/api.rb
211
+ - lib/adapi/budget_order.rb
211
212
  - lib/adapi/campaign.rb
212
213
  - lib/adapi/campaign_criterion.rb
213
214
  - lib/adapi/campaign_target.rb
@@ -218,6 +219,7 @@ files:
218
219
  - lib/adapi/constant_data/province.rb
219
220
  - lib/adapi/keyword.rb
220
221
  - lib/adapi/location.rb
222
+ - lib/adapi/managed_customer.rb
221
223
  - lib/adapi/version.rb
222
224
  - lib/httpi_monkeypatch.rb
223
225
  - test/factories/.gitignore
@@ -252,7 +254,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
252
254
  version: '0'
253
255
  segments:
254
256
  - 0
255
- hash: 426078939289165673
257
+ hash: -4480691592290868475
256
258
  required_rubygems_version: !ruby/object:Gem::Requirement
257
259
  none: false
258
260
  requirements:
@@ -261,7 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
263
  version: '0'
262
264
  segments:
263
265
  - 0
264
- hash: 426078939289165673
266
+ hash: -4480691592290868475
265
267
  requirements: []
266
268
  rubyforge_project: adapi
267
269
  rubygems_version: 1.8.15