google-ads-common 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -1
- data/Rakefile +46 -97
- data/lib/ads_common/api.rb +65 -91
- data/lib/ads_common/api_config.rb +11 -48
- data/lib/ads_common/savon_headers/client_login_header_handler.rb +60 -0
- data/lib/ads_common/savon_service.rb +24 -9
- data/test/test_config.rb +90 -0
- data/test/test_savon_service.rb +231 -0
- metadata +54 -41
data/ChangeLog
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
0.4.0:
|
2
|
+
- Extracted soap4r specific code from main path.
|
3
|
+
- APIs with Savon backend are now ruby1.9 - compatible.
|
4
|
+
- Fixed possible statement corruption after call.
|
5
|
+
|
1
6
|
0.3.0:
|
2
7
|
- Fixes towards Ruby1.9 compatibility.
|
3
|
-
- Support for method names with CAPSed words (Savon)
|
8
|
+
- Support for method names with CAPSed words (Savon).
|
4
9
|
- New single-Logger logging system.
|
5
10
|
|
6
11
|
0.2.1:
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
#
|
3
|
-
# Authors:: api.
|
3
|
+
# Authors:: api.dklimkin@gmail.com (Danial Klimkin)
|
4
4
|
#
|
5
5
|
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
6
6
|
#
|
@@ -20,109 +20,58 @@
|
|
20
20
|
# Rakefile for the ads_common package.
|
21
21
|
|
22
22
|
require 'rubygems'
|
23
|
-
|
24
|
-
require 'rake/gempackagetask'
|
25
|
-
require 'rake/rdoctask'
|
26
|
-
require 'rake/clean'
|
23
|
+
require 'rubygems/package_task'
|
27
24
|
require 'rake/testtask'
|
28
|
-
require '
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
25
|
+
require 'rdoc/task'
|
26
|
+
require './lib/ads_common/api_config'
|
27
|
+
|
28
|
+
GEM_NAME = 'google-ads-common'
|
29
|
+
|
30
|
+
files = FileList['lib/**/*', 'Rakefile'].to_a
|
31
|
+
tests = FileList['test/**/test_*.rb']
|
32
|
+
docs = ['README', 'COPYING', 'ChangeLog']
|
33
|
+
extra_files = ['test/test_config.yml']
|
34
|
+
|
35
|
+
spec = Gem::Specification.new do |s|
|
36
|
+
s.platform = Gem::Platform::RUBY
|
37
|
+
s.name = GEM_NAME
|
38
|
+
s.version = AdsCommon::ApiConfig::ADS_COMMON_VERSION
|
39
|
+
s.summary = 'Common code for Google Ads APIs.'
|
40
|
+
s.description = ("%s provides essential utilities shared by all Ads Ruby " +
|
41
|
+
"client libraries.") % GEM_NAME
|
42
|
+
s.authors = ['Sergio Gomes', 'Danial Klimkin']
|
43
|
+
s.email = 'api.dklimkin@gmail.com'
|
44
|
+
s.homepage = 'http://code.google.com/p/google-api-ads-ruby/'
|
45
|
+
s.require_path = 'lib'
|
46
|
+
s.files = files
|
47
|
+
s.test_files = tests
|
48
|
+
s.has_rdoc = true
|
49
|
+
s.extra_rdoc_files = docs
|
50
|
+
s.add_dependency('savon', '~> 0.9.1')
|
51
|
+
s.add_dependency('soap4r', '= 1.5.8')
|
52
|
+
s.add_dependency('httpclient', '>= 2.1.6')
|
53
|
+
s.add_dependency('httpi', '~> 0.9.2')
|
54
|
+
end
|
48
55
|
|
49
|
-
|
50
|
-
# Default task - call package
|
56
|
+
desc 'Default target - build'
|
51
57
|
task :default => [:package]
|
52
58
|
|
53
|
-
#
|
59
|
+
# Create a task that will package the Common library into a gem file.
|
60
|
+
Gem::PackageTask.new(spec) do |pkg|
|
61
|
+
pkg.need_tar = true
|
62
|
+
pkg.package_files.include(extra_files)
|
63
|
+
end
|
64
|
+
|
54
65
|
# Create a task to build the RDOC documentation tree.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
require 'sdoc'
|
59
|
-
rdoc.options << '--fmt' << 'shtml'
|
60
|
-
rdoc.template = 'direct'
|
61
|
-
rescue LoadError
|
62
|
-
# Do nothing, give up on SDoc and continue with whatever is the default.
|
63
|
-
end
|
64
|
-
rdoc.rdoc_dir = $DOCDIR
|
65
|
-
rdoc.title = "#{$PROJECT_NAME} -- Common code for Google Ads APIs"
|
66
|
+
RDoc::Task.new do |rdoc|
|
67
|
+
rdoc.rdoc_dir = 'doc'
|
68
|
+
rdoc.title = "%s -- Common code for Google Ads APIs" % GEM_NAME
|
66
69
|
rdoc.main = 'README'
|
67
|
-
rdoc.rdoc_files.include(
|
68
|
-
rdoc.rdoc_files.include(
|
70
|
+
rdoc.rdoc_files.include(docs)
|
71
|
+
rdoc.rdoc_files.include(files)
|
69
72
|
end
|
70
73
|
|
71
|
-
# ====================================================================
|
72
74
|
# Create a task to perform the unit testing.
|
73
|
-
Rake::TestTask.new
|
74
|
-
|
75
|
-
test.pattern = "#{$TESTDIR}/**/test_*.rb"
|
76
|
-
test.verbose = true
|
77
|
-
end
|
78
|
-
|
79
|
-
# ====================================================================
|
80
|
-
# Create a task that will package the Rake software into distributable
|
81
|
-
# gem files.
|
82
|
-
PKG_FILES = FileList[
|
83
|
-
'Rakefile',
|
84
|
-
"#{$LIBDIR}/**/*.rb",
|
85
|
-
"#{$DOCDIR}/**/*.*"
|
86
|
-
]
|
87
|
-
|
88
|
-
PKG_FILES.exclude(/\._/)
|
89
|
-
|
90
|
-
if ! defined?(Gem)
|
91
|
-
puts "Package Target requires RubyGems"
|
92
|
-
else
|
93
|
-
spec = Gem::Specification.new do |s|
|
94
|
-
|
95
|
-
# Basic information
|
96
|
-
s.name = $GEM_NAME
|
97
|
-
s.version = $PKG_VERSION
|
98
|
-
s.summary = $GEM_SUMMARY
|
99
|
-
s.description = $GEM_DESCRIPTION
|
100
|
-
|
101
|
-
# Files and dependencies
|
102
|
-
s.files = PKG_FILES.to_a
|
103
|
-
s.require_path = $LIBDIR
|
104
|
-
s.add_dependency('soap4r', '= 1.5.8')
|
105
|
-
s.add_dependency('savon', '~> 0.9.1')
|
106
|
-
s.add_dependency('httpclient', '>= 2.1.6')
|
107
|
-
s.add_dependency('httpi', '~> 0.9.2')
|
108
|
-
|
109
|
-
# RDoc information
|
110
|
-
s.has_rdoc = true
|
111
|
-
s.extra_rdoc_files = ['README', 'ChangeLog', 'COPYING']
|
112
|
-
s.rdoc_options << '--main' << 'README'
|
113
|
-
|
114
|
-
# Metadata
|
115
|
-
s.authors = $GEM_AUTHORS
|
116
|
-
s.email = $GEM_EMAIL
|
117
|
-
s.homepage = $GEM_HOMEPAGE
|
118
|
-
s.rubyforge_project = $GEM_NAME
|
119
|
-
s.requirements << 'soap4r v1.5.8'
|
120
|
-
s.requirements << 'savon v0.9.1 or greater'
|
121
|
-
s.requirements << 'httpclient v2.1.6 or greater'
|
122
|
-
s.requirements << 'httpi v0.9.2 or greater'
|
123
|
-
end
|
124
|
-
|
125
|
-
Rake::GemPackageTask.new(spec) do |t|
|
126
|
-
t.need_tar = true
|
127
|
-
end
|
75
|
+
Rake::TestTask.new do |t|
|
76
|
+
t.test_files = tests
|
128
77
|
end
|
data/lib/ads_common/api.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
#
|
3
|
-
# Authors:: api.
|
3
|
+
# Authors:: api.dklimkin@gmail.com (Danial Klimkin)
|
4
4
|
#
|
5
|
-
# Copyright:: Copyright
|
5
|
+
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
6
6
|
#
|
7
7
|
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
8
|
# you may not use this file except in compliance with the License.
|
@@ -24,33 +24,39 @@ require 'logger'
|
|
24
24
|
require 'ads_common/errors'
|
25
25
|
require 'ads_common/auth/base_handler'
|
26
26
|
require 'ads_common/auth/client_login_handler'
|
27
|
-
require 'ads_common/soap4r_headers/nested_header_handler'
|
28
|
-
require 'ads_common/soap4r_headers/single_header_handler'
|
29
|
-
require 'ads_common/soap4r_response_handler'
|
30
|
-
require 'ads_common/soap4r_logger'
|
31
27
|
|
32
28
|
module AdsCommon
|
33
29
|
class Api
|
34
30
|
|
35
|
-
# Methods that return the
|
36
|
-
#
|
37
|
-
attr_reader :
|
31
|
+
# Methods that return the client library configuration. Needs to be
|
32
|
+
# redefined in subclasses.
|
33
|
+
attr_reader :config
|
38
34
|
|
39
|
-
# Credential handler objects used for authentication
|
35
|
+
# Credential handler objects used for authentication.
|
40
36
|
attr_reader :credential_handler
|
41
37
|
|
42
|
-
# The
|
43
|
-
attr_reader :config
|
44
|
-
|
45
|
-
# The logger for this Api object.
|
38
|
+
# The logger for this API object.
|
46
39
|
attr_reader :logger
|
47
40
|
|
48
|
-
# Constructor for
|
41
|
+
# Constructor for API.
|
49
42
|
def initialize(provided_config = nil)
|
50
43
|
load_config(provided_config)
|
51
44
|
provided_logger = @config.read('library.logger')
|
52
45
|
self.logger = (provided_logger.nil?) ?
|
53
46
|
create_default_logger() : provided_logger
|
47
|
+
|
48
|
+
# Check for valid environment.
|
49
|
+
env_string = config.read('service.environment')
|
50
|
+
environment = (env_string.nil?) ? api_config.default_environment :
|
51
|
+
env_string.to_s.upcase.to_sym
|
52
|
+
if api_config.environments.include?(environment)
|
53
|
+
config.set('service.environment', environment)
|
54
|
+
else
|
55
|
+
raise AdsCommon::Errors::Error,
|
56
|
+
"Unknown or unspecified environment: \"%s\"" % env_string
|
57
|
+
end
|
58
|
+
|
59
|
+
@wrappers = Hash.new
|
54
60
|
end
|
55
61
|
|
56
62
|
# Sets the logger to use.
|
@@ -59,6 +65,11 @@ module AdsCommon
|
|
59
65
|
@config.set('library.logger', @logger)
|
60
66
|
end
|
61
67
|
|
68
|
+
# Getter for the API service configurations.
|
69
|
+
def api_config
|
70
|
+
AdsCommon::ApiConfig
|
71
|
+
end
|
72
|
+
|
62
73
|
# Obtain an API service, given a version and its name.
|
63
74
|
#
|
64
75
|
# Args:
|
@@ -69,34 +80,40 @@ module AdsCommon
|
|
69
80
|
# - the service wrapper for the intended service.
|
70
81
|
#
|
71
82
|
def service(name, version = nil)
|
72
|
-
version = api_config.default_version if version == nil
|
73
|
-
# Check if version exists
|
74
|
-
if !api_config.versions.include?(version.to_sym)
|
75
|
-
if version.is_a? Integer
|
76
|
-
raise AdsCommon::Errors::Error, "Unknown version '#{version}'. " +
|
77
|
-
"Please note that version numbers should be symbols; check the" +
|
78
|
-
"Readme or the included examples for more information."
|
79
|
-
else
|
80
|
-
raise AdsCommon::Errors::Error, "Unknown version #{version}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
version = version.to_sym
|
84
83
|
name = name.to_sym
|
85
|
-
|
86
|
-
|
84
|
+
version = (version.nil?) ? api_config.default_version : version.to_sym
|
85
|
+
|
86
|
+
# Check if version exists.
|
87
|
+
if !api_config.versions.include?(version)
|
88
|
+
raise AdsCommon::Errors::Error, "Unknown version '%s'." % version
|
89
|
+
end
|
90
|
+
|
91
|
+
# Check if the current environment supports the requested version.
|
92
|
+
environment = @config.read('service.environment')
|
87
93
|
if !api_config.environment_has_version(environment, version)
|
88
94
|
raise AdsCommon::Errors::Error,
|
89
|
-
|
95
|
+
"Environment '%s' does not support version '%s'." %
|
96
|
+
[environment, version]
|
90
97
|
end
|
91
|
-
|
98
|
+
|
99
|
+
# Check if the specified version has the requested service.
|
92
100
|
if !api_config.version_has_service(version, name)
|
93
|
-
raise AdsCommon::Errors::Error,
|
94
|
-
|
101
|
+
raise AdsCommon::Errors::Error,
|
102
|
+
"Version '%s' does not contain service '%s'", [version, name]
|
103
|
+
end
|
104
|
+
|
105
|
+
# Try to re-use the service for this version if it was requested before.
|
106
|
+
wrapper = if @wrappers.include?(version) && @wrappers[version][name]
|
107
|
+
@wrappers[version][name]
|
108
|
+
else
|
109
|
+
@wrappers[version] ||= {}
|
110
|
+
@wrappers[version][name] = prepare_wrapper(version, name)
|
95
111
|
end
|
96
|
-
|
97
|
-
return @wrappers[[version, name]]
|
112
|
+
return wrapper
|
98
113
|
end
|
99
114
|
|
115
|
+
private
|
116
|
+
|
100
117
|
# Retrieve the SOAP header handlers to plug into the drivers. Needs to
|
101
118
|
# be implemented on the specific API, because of the different types of
|
102
119
|
# SOAP headers (optional parameter specifying API version).
|
@@ -111,80 +128,37 @@ module AdsCommon
|
|
111
128
|
# Returns:
|
112
129
|
# - a list of SOAP header handlers; one per provided header
|
113
130
|
#
|
114
|
-
def soap_header_handlers(auth_handler, header_list, version, wrapper
|
131
|
+
def soap_header_handlers(auth_handler, header_list, version, wrapper)
|
132
|
+
raise NotImplementedError, 'soap_header_handlers not overriden.'
|
115
133
|
end
|
116
134
|
|
117
|
-
private
|
118
|
-
|
119
135
|
# Auxiliary method to create an authentication handler. Needs to be
|
120
136
|
# implemented on the specific API because of the different nesting models
|
121
137
|
# used in different APIs and API versions.
|
122
138
|
#
|
123
139
|
# Args:
|
124
|
-
# - version: intended API version
|
125
140
|
# - environment: the current working environment (production, sandbox, etc.)
|
141
|
+
# - version: intended API version
|
126
142
|
#
|
127
143
|
# Returns:
|
128
144
|
# - auth handler
|
129
145
|
#
|
130
|
-
def create_auth_handler(
|
146
|
+
def create_auth_handler(environment, version)
|
147
|
+
raise NotImplementedError, 'create_auth_handler not overriden.'
|
131
148
|
end
|
132
149
|
|
133
|
-
# Handle loading of a single service.
|
134
|
-
#
|
135
|
-
# wrapper class and creates an instance of it.
|
150
|
+
# Handle loading of a single service wrapper. Needs to be implemented on
|
151
|
+
# specific API level.
|
136
152
|
#
|
137
153
|
# Args:
|
138
|
-
# - version: intended API version. Must be
|
139
|
-
# - service: name for the intended service
|
154
|
+
# - version: intended API version. Must be a symbol.
|
155
|
+
# - service: name for the intended service. Must be a symbol.
|
140
156
|
#
|
141
157
|
# Returns:
|
142
|
-
# -
|
143
|
-
# - the simplified wrapper generated for the driver
|
158
|
+
# - a wrapper generated for the service.
|
144
159
|
#
|
145
|
-
def
|
146
|
-
|
147
|
-
service = service.to_sym
|
148
|
-
environment = config.read('service.environment')
|
149
|
-
api_config.do_require(version, service)
|
150
|
-
endpoint = api_config.endpoint(environment, version, service)
|
151
|
-
# Set endpoint if not using the default
|
152
|
-
if endpoint.nil? then
|
153
|
-
driver = eval("#{api_config.interface_name(version, service)}.new")
|
154
|
-
else
|
155
|
-
endpoint_url = endpoint.to_s + service.to_s
|
156
|
-
driver = eval("#{api_config.interface_name(version, service)}.new" +
|
157
|
-
"(\"#{endpoint_url}\")")
|
158
|
-
end
|
159
|
-
|
160
|
-
# Create an instance of the wrapper class for this service.
|
161
|
-
wrapper_class = api_config.wrapper_name(version, service)
|
162
|
-
wrapper = eval("#{wrapper_class}.new(driver, self)")
|
163
|
-
|
164
|
-
auth_handler = create_auth_handler(version, environment)
|
165
|
-
header_list =
|
166
|
-
auth_handler.header_list(@credential_handler.credentials(version))
|
167
|
-
|
168
|
-
soap_handlers = soap_header_handlers(auth_handler, header_list, version,
|
169
|
-
wrapper)
|
170
|
-
|
171
|
-
soap_handlers.each do |handler|
|
172
|
-
driver.headerhandler << handler
|
173
|
-
end
|
174
|
-
|
175
|
-
# Add response handler to this driver for API unit usage processing.
|
176
|
-
driver.callbackhandler = create_callback_handler
|
177
|
-
# Plug the wiredump to our XML logger
|
178
|
-
driver.wiredump_dev = AdsCommon::Soap4rLogger.new(@logger, Logger::DEBUG)
|
179
|
-
driver.options['protocol.http.ssl_config.verify_mode'] = nil
|
180
|
-
proxy = config.read('connection.proxy')
|
181
|
-
if proxy
|
182
|
-
driver.options['protocol.http.proxy'] = proxy
|
183
|
-
end
|
184
|
-
|
185
|
-
@drivers[[version, service]] = driver
|
186
|
-
@wrappers[[version, service]] = wrapper
|
187
|
-
return driver, wrapper
|
160
|
+
def prepare_wrapper(version, service)
|
161
|
+
raise NotImplementedError, 'prepare_wrapper not overriden.'
|
188
162
|
end
|
189
163
|
|
190
164
|
# Auxiliary method to create a default Logger.
|
@@ -214,7 +188,7 @@ module AdsCommon
|
|
214
188
|
if log_level.is_a?(String)
|
215
189
|
result = case log_level.upcase
|
216
190
|
when 'FATAL' then Logger::FATAL
|
217
|
-
when 'ERROR' then Logger
|
191
|
+
when 'ERROR' then Logger::ERROR
|
218
192
|
when 'WARN' then Logger::WARN
|
219
193
|
when 'INFO' then Logger::INFO
|
220
194
|
when 'DEBUG' then Logger::DEBUG
|
@@ -26,7 +26,7 @@ module AdsCommon
|
|
26
26
|
# Contains helper methods for loading and managing the available services.
|
27
27
|
# This module is meant to be imported into API-specific modules.
|
28
28
|
module ApiConfig
|
29
|
-
ADS_COMMON_VERSION = '0.
|
29
|
+
ADS_COMMON_VERSION = '0.4.0'
|
30
30
|
|
31
31
|
# Get the available API versions.
|
32
32
|
#
|
@@ -53,10 +53,8 @@ module AdsCommon
|
|
53
53
|
# given version
|
54
54
|
#
|
55
55
|
def environment_has_version(environment, version)
|
56
|
-
environment
|
57
|
-
|
58
|
-
!environment_config[environment].nil? and
|
59
|
-
!environment_config[environment][version].nil?
|
56
|
+
return environment_config.include?(environment) &&
|
57
|
+
environment_config[environment].include?(version)
|
60
58
|
end
|
61
59
|
|
62
60
|
# Does the given version exist and contain the given service?
|
@@ -66,10 +64,8 @@ module AdsCommon
|
|
66
64
|
# given service
|
67
65
|
#
|
68
66
|
def version_has_service(version, service)
|
69
|
-
version
|
70
|
-
|
71
|
-
(!service_config[version].nil? and
|
72
|
-
service_config[version].include?(service))
|
67
|
+
return service_config.include?(version) &&
|
68
|
+
service_config[version].include?(service)
|
73
69
|
end
|
74
70
|
|
75
71
|
# Get the default API version.
|
@@ -127,9 +123,6 @@ module AdsCommon
|
|
127
123
|
# The endpoint URL (as a string)
|
128
124
|
#
|
129
125
|
def endpoint(environment, version, service)
|
130
|
-
environment = environment.upcase.to_sym
|
131
|
-
version = version.to_sym
|
132
|
-
service = service.to_sym
|
133
126
|
base = get_wsdl_base(environment, version)
|
134
127
|
if !subdir_config().nil?
|
135
128
|
base = base.to_s + subdir_config()[[version, service]].to_s
|
@@ -148,8 +141,6 @@ module AdsCommon
|
|
148
141
|
#
|
149
142
|
def subdir(version, service)
|
150
143
|
return nil if subdir_config().nil?
|
151
|
-
version = version.to_sym
|
152
|
-
service = service.to_sym
|
153
144
|
subdir_config()[[version, service]]
|
154
145
|
end
|
155
146
|
|
@@ -163,39 +154,19 @@ module AdsCommon
|
|
163
154
|
# The full URL for the auth server.
|
164
155
|
#
|
165
156
|
def auth_server(environment)
|
166
|
-
auth_server_url =
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
171
|
-
if auth_server_url.nil?
|
172
|
-
# If we don't have an entry for this environment, we just return the
|
173
|
-
# default server (the same one being used for the default environment)
|
174
|
-
auth_server_url = auth_server_config[default_environment()]
|
175
|
-
end
|
157
|
+
auth_server_url =
|
158
|
+
ENV['ADSAPI_AUTH_URL'] ||
|
159
|
+
auth_server_config[environment] ||
|
160
|
+
auth_server_config[default_environment()]
|
176
161
|
return auth_server_url
|
177
162
|
end
|
178
163
|
|
179
|
-
# Add a new environment to the list.
|
180
|
-
#
|
181
|
-
# Args:
|
182
|
-
# - name: the name for the new environment
|
183
|
-
# - endpoint_hash: a hash of base endpoint URLs, indexed by version number,
|
184
|
-
# e.g.:
|
185
|
-
# { :v13 => 'URL_FOR_v13', :v200906 => 'URL_FOR_v200906' }
|
186
|
-
#
|
187
|
-
def add_environment(name, endpoint_hash)
|
188
|
-
name = name.upcase.to_sym
|
189
|
-
environment_config[name] = endpoint_hash
|
190
|
-
end
|
191
|
-
|
192
164
|
# Perform the loading of the necessary source files for a version
|
193
165
|
#
|
194
166
|
# Args:
|
195
167
|
# - version: the API version (as an integer)
|
196
168
|
#
|
197
169
|
def do_require(version, service)
|
198
|
-
version = version.to_sym
|
199
170
|
eval("require '#{api_path}/#{version}/#{service}Wrapper.rb'")
|
200
171
|
end
|
201
172
|
|
@@ -209,8 +180,6 @@ module AdsCommon
|
|
209
180
|
# The full module name for the given service (as a string)
|
210
181
|
#
|
211
182
|
def module_name(version, service)
|
212
|
-
version = version.to_sym
|
213
|
-
service = service.to_sym
|
214
183
|
return "#{api_name}::#{version.to_s.upcase}::#{service}"
|
215
184
|
end
|
216
185
|
|
@@ -224,8 +193,6 @@ module AdsCommon
|
|
224
193
|
# The full interface class name for the given service (as a string)
|
225
194
|
#
|
226
195
|
def interface_name(version, service)
|
227
|
-
version = version.to_sym
|
228
|
-
service = service.to_sym
|
229
196
|
return module_name(version, service) + "::#{service}Interface"
|
230
197
|
end
|
231
198
|
|
@@ -239,8 +206,6 @@ module AdsCommon
|
|
239
206
|
# The full wrapper class name for the given service (as a string)
|
240
207
|
#
|
241
208
|
def wrapper_name(version, service)
|
242
|
-
version = version.to_sym
|
243
|
-
service = service.to_sym
|
244
209
|
return module_name(version, service) + "::#{service}Wrapper"
|
245
210
|
end
|
246
211
|
|
@@ -279,10 +244,8 @@ module AdsCommon
|
|
279
244
|
# Returns:
|
280
245
|
# String containing base URL.
|
281
246
|
def get_wsdl_base(environment, version)
|
282
|
-
wsdl_base = ENV['ADSAPI_BASE_URL']
|
283
|
-
|
284
|
-
wsdl_base = environment_config[environment][version]
|
285
|
-
end
|
247
|
+
wsdl_base = ENV['ADSAPI_BASE_URL'] ||
|
248
|
+
wsdl_base = environment_config[environment][version]
|
286
249
|
return wsdl_base
|
287
250
|
end
|
288
251
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Authors:: api.dklimkin@gmail.com (Danial Klimkin)
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
# Handles SOAP headers and namespaces definition for ClientLogin type header.
|
21
|
+
|
22
|
+
require 'ads_common/savon_headers/simple_header_handler'
|
23
|
+
|
24
|
+
module AdsCommon
|
25
|
+
module SavonHeaders
|
26
|
+
class ClientLoginHeaderHandler < SimpleHeaderHandler
|
27
|
+
private
|
28
|
+
|
29
|
+
# Generates SOAP request header with login credentials and namespace
|
30
|
+
# definition.
|
31
|
+
#
|
32
|
+
# Args:
|
33
|
+
# - None.
|
34
|
+
#
|
35
|
+
# Returns:
|
36
|
+
# - Hash containing a header with filled in credentials.
|
37
|
+
#
|
38
|
+
def generate_request_header()
|
39
|
+
request_header = {}
|
40
|
+
credentials = @credential_handler.credentials(@version)
|
41
|
+
headers = @auth_handler.headers(credentials)
|
42
|
+
headers.each do |header, value|
|
43
|
+
if header == :authToken
|
44
|
+
auth_header = prepend_namespace('authentication')
|
45
|
+
request_header[auth_header] = {
|
46
|
+
prepend_namespace('token') => value
|
47
|
+
}
|
48
|
+
request_header[:attributes!] ||= Hash.new
|
49
|
+
request_header[:attributes!][auth_header] = {
|
50
|
+
'xsi:type' => prepend_namespace('ClientLogin'),
|
51
|
+
}
|
52
|
+
else
|
53
|
+
request_header[prepend_namespace(header)] = value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
return request_header
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -78,7 +78,7 @@ module AdsCommon
|
|
78
78
|
in_params = get_service_registry.get_method_signature(action_name)[:input]
|
79
79
|
in_params.each_with_index do |in_param, index|
|
80
80
|
key = in_param[:name]
|
81
|
-
value = args[index]
|
81
|
+
value = deep_copy(args[index])
|
82
82
|
validated_args[key] = (value.nil?) ? nil :
|
83
83
|
validate_arg(value, validated_args, key)
|
84
84
|
end
|
@@ -223,14 +223,12 @@ module AdsCommon
|
|
223
223
|
# Converts XML input string into a native format.
|
224
224
|
def normalize_type(data, field)
|
225
225
|
type_name = field[:type]
|
226
|
-
result =
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
else data
|
233
|
-
end
|
226
|
+
result = case data
|
227
|
+
when Array
|
228
|
+
data.map {|item| normalize_item(type_name, item)}
|
229
|
+
else
|
230
|
+
normalize_item(type_name, data)
|
231
|
+
end
|
234
232
|
# If field signature allows an array, forcing array structure even for one
|
235
233
|
# item.
|
236
234
|
if !field[:min_occurs].nil? and
|
@@ -240,6 +238,18 @@ module AdsCommon
|
|
240
238
|
return result
|
241
239
|
end
|
242
240
|
|
241
|
+
# Converts one leaf item to a built-in type.
|
242
|
+
def normalize_item(type_name, item)
|
243
|
+
return (item.nil?) ? item :
|
244
|
+
case type_name
|
245
|
+
when 'long', 'int' then Integer(item)
|
246
|
+
when 'double' then Float(item)
|
247
|
+
when 'boolean' then item.kind_of?(String) ?
|
248
|
+
item.casecmp('true') == 0 : item
|
249
|
+
else item
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
243
253
|
# Finds a field in a list by its name.
|
244
254
|
def get_field_by_name(fields_list, name)
|
245
255
|
fields_array = arrayize(fields_list)
|
@@ -271,5 +281,10 @@ module AdsCommon
|
|
271
281
|
end
|
272
282
|
return result
|
273
283
|
end
|
284
|
+
|
285
|
+
# Returns copy of object and its sub-objects ("deep" copy).
|
286
|
+
def deep_copy(data)
|
287
|
+
return Marshal.load(Marshal.dump(data))
|
288
|
+
end
|
274
289
|
end
|
275
290
|
end
|
data/test/test_config.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
# Tests the array replies from services.
|
21
|
+
|
22
|
+
require 'rubygems'
|
23
|
+
require 'test/unit'
|
24
|
+
require 'ads_common/config'
|
25
|
+
|
26
|
+
class TestConfig < Test::Unit::TestCase
|
27
|
+
DEFAULT_CONFIG_HASH = {
|
28
|
+
:service => {:use_ruby_names => false,
|
29
|
+
:environment => 'sandbox'},
|
30
|
+
:authentication => {:method => 'ClientLogin',
|
31
|
+
:email => 'root@example.com'}
|
32
|
+
}
|
33
|
+
|
34
|
+
DEFAULT_CONFIG_FILENAME = 'test/test_config.yml'
|
35
|
+
|
36
|
+
# Test initializer with no arguments.
|
37
|
+
def test_initialize_nil
|
38
|
+
assert_nothing_raised do
|
39
|
+
config = AdsCommon::Config.new
|
40
|
+
assert_nil(config.read('service.use_ruby_names'))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Test initializer with hash argument.
|
45
|
+
def test_initialize_hash
|
46
|
+
config = AdsCommon::Config.new(DEFAULT_CONFIG_HASH)
|
47
|
+
assert_equal(false, config.read('service.use_ruby_names'))
|
48
|
+
assert_equal('sandbox', config.read('service.environment'))
|
49
|
+
assert_equal('ClientLogin', config.read('authentication.method'))
|
50
|
+
assert_equal('root@example.com', config.read('authentication.email'))
|
51
|
+
assert_nil(config.read('unexisting.entry'))
|
52
|
+
end
|
53
|
+
|
54
|
+
# Test initializer with filename argument.
|
55
|
+
def test_initialize_filename
|
56
|
+
config = AdsCommon::Config.new(DEFAULT_CONFIG_FILENAME)
|
57
|
+
assert_equal(false, config.read('service.use_ruby_names'))
|
58
|
+
assert_equal('sandbox', config.read('service.environment'))
|
59
|
+
assert_equal('ClientLogin', config.read('authentication.method'))
|
60
|
+
assert_equal('root@example.com', config.read('authentication.email'))
|
61
|
+
assert_nil(config.read('unexisting.entry'))
|
62
|
+
end
|
63
|
+
|
64
|
+
# Test default result.
|
65
|
+
def test_read_default_result
|
66
|
+
config = AdsCommon::Config.new(DEFAULT_CONFIG_HASH)
|
67
|
+
assert_nil(config.read('unexisting.entry'))
|
68
|
+
assert_equal('default', config.read('unexisting.entry', 'default'))
|
69
|
+
assert_equal('sandbox', config.read('service.environment', 'production'))
|
70
|
+
end
|
71
|
+
|
72
|
+
# Test setter.
|
73
|
+
def test_set
|
74
|
+
config = AdsCommon::Config.new(DEFAULT_CONFIG_HASH)
|
75
|
+
assert_equal('sandbox', config.read('service.environment'))
|
76
|
+
assert_nil(config.read('unexisting.entry'))
|
77
|
+
config.set('unexisting.entry', 'foobar')
|
78
|
+
assert_equal('sandbox', config.read('service.environment'))
|
79
|
+
assert_equal('foobar', config.read('unexisting.entry'))
|
80
|
+
end
|
81
|
+
|
82
|
+
# Test subhash.
|
83
|
+
def test_set
|
84
|
+
config = AdsCommon::Config.new(DEFAULT_CONFIG_HASH)
|
85
|
+
result = config.read('service')
|
86
|
+
assert_instance_of(Hash, result)
|
87
|
+
assert_equal('sandbox', result[:environment])
|
88
|
+
assert_equal(false, result[:use_ruby_names])
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
# Tests the array replies from services.
|
21
|
+
|
22
|
+
require 'rubygems'
|
23
|
+
require 'test/unit'
|
24
|
+
require 'pp'
|
25
|
+
require 'ads_common/savon_service'
|
26
|
+
|
27
|
+
# SavonService is abstract, defining a child class for the test.
|
28
|
+
class SomeService < AdsCommon::SavonService
|
29
|
+
def private_get_service_registry()
|
30
|
+
return get_service_registry
|
31
|
+
end
|
32
|
+
def private_get_module()
|
33
|
+
return get_module
|
34
|
+
end
|
35
|
+
def private_normalize_type(data, field)
|
36
|
+
return normalize_type(data, field)
|
37
|
+
end
|
38
|
+
def private_get_field_by_name(fields_list, name)
|
39
|
+
return get_field_by_name(fields_list, name)
|
40
|
+
end
|
41
|
+
def private_arrayize(object)
|
42
|
+
return arrayize(object)
|
43
|
+
end
|
44
|
+
def private_deep_copy(object)
|
45
|
+
return deep_copy(object)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class TestSavonService < Test::Unit::TestCase
|
50
|
+
TEST_NAMESPACE = 'namespace'
|
51
|
+
TEST_ENDPOINT = 'endpoint'
|
52
|
+
|
53
|
+
# Initialize tests.
|
54
|
+
def setup
|
55
|
+
@some_service = SomeService.new(TEST_NAMESPACE, TEST_ENDPOINT)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_initialize_abstract
|
59
|
+
assert_raises(NoMethodError) do
|
60
|
+
AdsCommon::SavonService.new(TEST_NAMESPACE, TEST_ENDPOINT)
|
61
|
+
end
|
62
|
+
assert_nothing_raised do
|
63
|
+
SomeService.new(TEST_NAMESPACE, TEST_ENDPOINT)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_get_service_registry_abstract
|
68
|
+
assert_raises(NoMethodError) { @some_service.private_get_service_registry }
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_get_module_abstract
|
72
|
+
assert_raises(NoMethodError) { @some_service.private_get_module }
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_arrayize_empty
|
76
|
+
result1 = @some_service.private_arrayize(nil)
|
77
|
+
assert_instance_of(Array, result1, 'returned object is not an Array')
|
78
|
+
assert_equal(0, result1.size, 'array is not empty')
|
79
|
+
|
80
|
+
result2 = @some_service.private_arrayize([])
|
81
|
+
assert_instance_of(Array, result2, 'returned object is not an Array')
|
82
|
+
assert_equal(0, result2.size, 'array is not empty')
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_arrayize_on_array
|
86
|
+
result1 = @some_service.private_arrayize([nil])
|
87
|
+
assert_instance_of(Array, result1, 'returned object is not an Array')
|
88
|
+
assert_equal(1, result1.size, 'array changed size')
|
89
|
+
assert_equal(nil, result1[0], 'array changed data')
|
90
|
+
|
91
|
+
result2 = @some_service.private_arrayize(['a', 'b'])
|
92
|
+
assert_instance_of(Array, result2, 'returned object is not an Array')
|
93
|
+
assert_equal(2, result2.size, 'array changed size')
|
94
|
+
assert_equal('a', result2[0], 'array changed data')
|
95
|
+
assert_equal('b', result2[1], 'array changed data')
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_normalize_type_int
|
99
|
+
result1 = @some_service.private_normalize_type(5, {:type => 'int'})
|
100
|
+
assert_kind_of(Integer, result1)
|
101
|
+
assert_equal(5, result1, 'bad conversion')
|
102
|
+
|
103
|
+
result2 = @some_service.private_normalize_type(2147483648, {:type => 'int'})
|
104
|
+
assert_kind_of(Integer, result2)
|
105
|
+
assert_equal(2147483648, result2, 'bad conversion')
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_normalize_type_string
|
109
|
+
result1 = @some_service.private_normalize_type('foobar',
|
110
|
+
{:type => 'string'})
|
111
|
+
assert_kind_of(String, result1)
|
112
|
+
assert_equal('foobar', result1, 'bad conversion')
|
113
|
+
|
114
|
+
result2 = @some_service.private_normalize_type('', {:type => 'string'})
|
115
|
+
assert_kind_of(String, result2)
|
116
|
+
assert_equal('', result2, 'bad conversion')
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_normalize_type_long
|
120
|
+
result1 = @some_service.private_normalize_type(2147483648,
|
121
|
+
{:type => 'long'})
|
122
|
+
assert_kind_of(Integer, result1)
|
123
|
+
assert_equal(2147483648, result1, 'bad conversion')
|
124
|
+
|
125
|
+
result2 = @some_service.private_normalize_type(-1, {:type => 'long'})
|
126
|
+
assert_kind_of(Integer, result2)
|
127
|
+
assert_equal(-1, result2, 'bad conversion')
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_normalize_type_boolean
|
131
|
+
result1 = @some_service.private_normalize_type(true, {:type => 'boolean'})
|
132
|
+
assert_kind_of(TrueClass, result1)
|
133
|
+
|
134
|
+
result2 = @some_service.private_normalize_type(false, {:type => 'boolean'})
|
135
|
+
assert_kind_of(FalseClass, result2)
|
136
|
+
|
137
|
+
result3 = @some_service.private_normalize_type('true', {:type => 'boolean'})
|
138
|
+
assert_kind_of(TrueClass, result3)
|
139
|
+
|
140
|
+
result4 = @some_service.private_normalize_type('false',
|
141
|
+
{:type => 'boolean'})
|
142
|
+
assert_kind_of(FalseClass, result4)
|
143
|
+
|
144
|
+
result5 = @some_service.private_normalize_type('True',
|
145
|
+
{:type => 'boolean'})
|
146
|
+
assert_kind_of(TrueClass, result3)
|
147
|
+
|
148
|
+
result6 = @some_service.private_normalize_type('False',
|
149
|
+
{:type => 'boolean'})
|
150
|
+
assert_kind_of(FalseClass, result4)
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_normalize_type_object
|
154
|
+
result1 = @some_service.private_normalize_type({:a => 'b'},
|
155
|
+
{:type => 'SomeClass'})
|
156
|
+
assert_equal('b', result1[:a], 'object corrupted')
|
157
|
+
|
158
|
+
result2 = @some_service.private_normalize_type(@some_service,
|
159
|
+
{:type => 'SavonService'})
|
160
|
+
assert_equal(@some_service.hash, result2.hash, 'object corrupted')
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_normalize_type_double
|
164
|
+
result1 = @some_service.send(:private_normalize_type, 3.14,
|
165
|
+
{:type => 'double'})
|
166
|
+
assert_kind_of(Float, result1)
|
167
|
+
assert_equal(3.14, result1, 'bad conversion')
|
168
|
+
|
169
|
+
result2 = @some_service.send(:private_normalize_type, '-3.14',
|
170
|
+
{:type => 'double'})
|
171
|
+
assert_kind_of(Float, result2)
|
172
|
+
assert_equal(-3.14, result2, 'bad conversion')
|
173
|
+
|
174
|
+
result3 = @some_service.send(:private_normalize_type, '42',
|
175
|
+
{:type => 'double'})
|
176
|
+
assert_kind_of(Float, result3)
|
177
|
+
assert_equal(42.0, result3, 'bad conversion')
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_normalize_type_single_array_item
|
181
|
+
result1 = @some_service.private_normalize_type('42',
|
182
|
+
{:type => 'double', :min_occurs => '0', :max_occurs => 1})
|
183
|
+
assert_kind_of(Float, result1)
|
184
|
+
assert_equal(42.0, result1, 'Float expected for max_occurs 1')
|
185
|
+
|
186
|
+
result2 = @some_service.private_normalize_type('42',
|
187
|
+
{:type => 'double', :min_occurs => '0', :max_occurs => nil})
|
188
|
+
assert_instance_of(Array, result2)
|
189
|
+
assert_equal(42.0, result2[0], 'Array is expected for undefined max_occurs')
|
190
|
+
|
191
|
+
result3 = @some_service.private_normalize_type('42',
|
192
|
+
{:type => 'double', :min_occurs => '0', :max_occurs => 2})
|
193
|
+
assert_instance_of(Array, result3)
|
194
|
+
assert_equal(42.0, result3[0], 'Array is expected for max_occurs > 1')
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_deep_copy_simple
|
198
|
+
result1 = @some_service.private_deep_copy(42)
|
199
|
+
assert_equal(42, result1)
|
200
|
+
|
201
|
+
result2 = @some_service.private_deep_copy('Hello World')
|
202
|
+
assert_equal('Hello World', result2)
|
203
|
+
|
204
|
+
result3 = @some_service.private_deep_copy(nil)
|
205
|
+
assert_nil(result3)
|
206
|
+
|
207
|
+
result4 = @some_service.private_deep_copy([])
|
208
|
+
assert_equal([], result4)
|
209
|
+
assert_not_same([], result4)
|
210
|
+
|
211
|
+
result5 = @some_service.private_deep_copy({})
|
212
|
+
assert_equal({}, result5)
|
213
|
+
assert_not_same({}, result5)
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_deep_copy_complex
|
217
|
+
data = {:ab => 'ab', :cd => ['cd', 'de', 'ef']}
|
218
|
+
|
219
|
+
result1 = @some_service.private_deep_copy(data)
|
220
|
+
assert_equal(data, result1)
|
221
|
+
assert_not_same(data, result1)
|
222
|
+
|
223
|
+
result2 = @some_service.private_deep_copy(data)
|
224
|
+
assert_equal(result2, result1)
|
225
|
+
assert_not_same(result2, result1)
|
226
|
+
|
227
|
+
result2[:cd] = nil
|
228
|
+
assert_not_equal(data, result2)
|
229
|
+
assert_equal(data, result1)
|
230
|
+
end
|
231
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-ads-common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
+
- 4
|
8
9
|
- 0
|
9
|
-
version: 0.
|
10
|
+
version: 0.4.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Sergio Gomes
|
@@ -15,44 +16,50 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2011-06-
|
19
|
+
date: 2011-06-20 00:00:00 +04:00
|
19
20
|
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
23
|
+
name: savon
|
23
24
|
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
25
27
|
requirements:
|
26
|
-
- -
|
28
|
+
- - ~>
|
27
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 57
|
28
31
|
segments:
|
32
|
+
- 0
|
33
|
+
- 9
|
29
34
|
- 1
|
30
|
-
|
31
|
-
- 8
|
32
|
-
version: 1.5.8
|
35
|
+
version: 0.9.1
|
33
36
|
type: :runtime
|
34
37
|
version_requirements: *id001
|
35
38
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
39
|
+
name: soap4r
|
37
40
|
prerelease: false
|
38
41
|
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
39
43
|
requirements:
|
40
|
-
- -
|
44
|
+
- - "="
|
41
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 19
|
42
47
|
segments:
|
43
|
-
- 0
|
44
|
-
- 9
|
45
48
|
- 1
|
46
|
-
|
49
|
+
- 5
|
50
|
+
- 8
|
51
|
+
version: 1.5.8
|
47
52
|
type: :runtime
|
48
53
|
version_requirements: *id002
|
49
54
|
- !ruby/object:Gem::Dependency
|
50
55
|
name: httpclient
|
51
56
|
prerelease: false
|
52
57
|
requirement: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
53
59
|
requirements:
|
54
60
|
- - ">="
|
55
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 7
|
56
63
|
segments:
|
57
64
|
- 2
|
58
65
|
- 1
|
@@ -64,9 +71,11 @@ dependencies:
|
|
64
71
|
name: httpi
|
65
72
|
prerelease: false
|
66
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
67
75
|
requirements:
|
68
76
|
- - ~>
|
69
77
|
- !ruby/object:Gem::Version
|
78
|
+
hash: 63
|
70
79
|
segments:
|
71
80
|
- 0
|
72
81
|
- 9
|
@@ -74,76 +83,80 @@ dependencies:
|
|
74
83
|
version: 0.9.2
|
75
84
|
type: :runtime
|
76
85
|
version_requirements: *id004
|
77
|
-
description:
|
78
|
-
email: api.
|
86
|
+
description: google-ads-common provides essential utilities shared by all Ads Ruby client libraries.
|
87
|
+
email: api.dklimkin@gmail.com
|
79
88
|
executables: []
|
80
89
|
|
81
90
|
extensions: []
|
82
91
|
|
83
92
|
extra_rdoc_files:
|
84
93
|
- README
|
85
|
-
- ChangeLog
|
86
94
|
- COPYING
|
95
|
+
- ChangeLog
|
87
96
|
files:
|
88
|
-
- Rakefile
|
89
97
|
- lib/ads_common/auth/base_handler.rb
|
90
98
|
- lib/ads_common/auth/client_login_handler.rb
|
91
|
-
- lib/ads_common/
|
99
|
+
- lib/ads_common/api_config.rb
|
100
|
+
- lib/ads_common/config.rb
|
101
|
+
- lib/ads_common/credential_handler.rb
|
102
|
+
- lib/ads_common/errors.rb
|
103
|
+
- lib/ads_common/http.rb
|
104
|
+
- lib/ads_common/api.rb
|
105
|
+
- lib/ads_common/savon_service.rb
|
106
|
+
- lib/ads_common/soap4r_patches.rb
|
107
|
+
- lib/ads_common/soap4r_response_handler.rb
|
92
108
|
- lib/ads_common/build/rake_common.rb
|
93
|
-
- lib/ads_common/build/
|
109
|
+
- lib/ads_common/build/savon_abstract_generator.rb
|
94
110
|
- lib/ads_common/build/savon_generator.rb
|
95
111
|
- lib/ads_common/build/savon_registry.rb
|
112
|
+
- lib/ads_common/build/savon_registry_generator.rb
|
96
113
|
- lib/ads_common/build/savon_service_generator.rb
|
97
114
|
- lib/ads_common/build/soap4r_generator.rb
|
98
115
|
- lib/ads_common/savon_headers/simple_header_handler.rb
|
116
|
+
- lib/ads_common/savon_headers/client_login_header_handler.rb
|
99
117
|
- lib/ads_common/soap4r_headers/nested_header_handler.rb
|
100
118
|
- lib/ads_common/soap4r_headers/single_header_handler.rb
|
101
|
-
- lib/ads_common/api_config.rb
|
102
|
-
- lib/ads_common/api.rb
|
103
|
-
- lib/ads_common/soap4r_response_handler.rb
|
104
|
-
- lib/ads_common/config.rb
|
105
|
-
- lib/ads_common/credential_handler.rb
|
106
|
-
- lib/ads_common/errors.rb
|
107
|
-
- lib/ads_common/http.rb
|
108
|
-
- lib/ads_common/savon_service.rb
|
109
|
-
- lib/ads_common/soap4r_patches.rb
|
110
119
|
- lib/ads_common/soap4r_logger.rb
|
120
|
+
- Rakefile
|
121
|
+
- test/test_config.rb
|
122
|
+
- test/test_savon_service.rb
|
111
123
|
- README
|
112
|
-
- ChangeLog
|
113
124
|
- COPYING
|
125
|
+
- ChangeLog
|
114
126
|
has_rdoc: true
|
115
127
|
homepage: http://code.google.com/p/google-api-ads-ruby/
|
116
128
|
licenses: []
|
117
129
|
|
118
130
|
post_install_message:
|
119
|
-
rdoc_options:
|
120
|
-
|
121
|
-
- README
|
131
|
+
rdoc_options: []
|
132
|
+
|
122
133
|
require_paths:
|
123
134
|
- lib
|
124
135
|
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
125
137
|
requirements:
|
126
138
|
- - ">="
|
127
139
|
- !ruby/object:Gem::Version
|
140
|
+
hash: 3
|
128
141
|
segments:
|
129
142
|
- 0
|
130
143
|
version: "0"
|
131
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
132
146
|
requirements:
|
133
147
|
- - ">="
|
134
148
|
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
135
150
|
segments:
|
136
151
|
- 0
|
137
152
|
version: "0"
|
138
|
-
requirements:
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
- httpi v0.9.2 or greater
|
143
|
-
rubyforge_project: google-ads-common
|
144
|
-
rubygems_version: 1.3.6
|
153
|
+
requirements: []
|
154
|
+
|
155
|
+
rubyforge_project:
|
156
|
+
rubygems_version: 1.3.7
|
145
157
|
signing_key:
|
146
158
|
specification_version: 3
|
147
159
|
summary: Common code for Google Ads APIs.
|
148
|
-
test_files:
|
149
|
-
|
160
|
+
test_files:
|
161
|
+
- test/test_config.rb
|
162
|
+
- test/test_savon_service.rb
|