sem4r 0.1.2 → 0.1.3

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.
Files changed (175) hide show
  1. data/Gemfile +13 -2
  2. data/Gemfile.lock +13 -7
  3. data/README.rdoc +44 -7
  4. data/Rakefile +2 -122
  5. data/VERSION.yml +1 -1
  6. data/bin/sem +1 -0
  7. data/examples_sem4r/01_get_account.rb +1 -0
  8. data/examples_sem4r/02_get_info.rb +1 -0
  9. data/examples_sem4r/03_list_ad.rb +1 -0
  10. data/examples_sem4r/04_list_keywords.rb +1 -0
  11. data/examples_sem4r/05_request_report.rb +25 -14
  12. data/examples_sem4r/{05_request_report_2010.rb → 06_request_report_definition.rb} +2 -4
  13. data/examples_sem4r/{06_create_campaigns.rb → 07_create_campaigns.rb} +1 -0
  14. data/examples_sem4r/{07_create_campaigns_block.rb → 08_create_campaigns_block.rb} +1 -0
  15. data/examples_sem4r/{07_create_campaigns_simple.rb → 09_create_campaigns_simple.rb} +1 -0
  16. data/examples_sem4r/{08_ad_params.rb → 10_ad_params.rb} +1 -0
  17. data/examples_sem4r/{09_targeting_idea.rb → 11_targeting_idea.rb} +1 -0
  18. data/examples_sem4r/{10_get_location.rb → 12_get_location.rb} +1 -0
  19. data/examples_sem4r/{11_submit_bulk_job.rb → 13_submit_bulk_job.rb} +1 -1
  20. data/examples_sem4r/{12_list_bulk_job.rb → 14_list_bulk_job.rb} +3 -0
  21. data/examples_sem4r/30_prune_empty_adgroup.rb +1 -0
  22. data/examples_sem4r/31_empty_accounts.rb +1 -0
  23. data/examples_sem4r/example_helper.rb +2 -1
  24. data/lib/sem4r/ad_group/ad_group.rb +22 -7
  25. data/lib/sem4r/ad_group/ad_group_bids.rb +1 -1
  26. data/lib/sem4r/ad_group/ad_group_service.rb +12 -5
  27. data/lib/sem4r/ad_group_ad/ad_group_ad.rb +1 -0
  28. data/lib/sem4r/ad_group_ad/ad_group_ad_operations.rb +1 -0
  29. data/lib/sem4r/ad_group_ad/ad_group_ad_service.rb +14 -9
  30. data/lib/sem4r/ad_group_ad/ad_group_mobile_ad.rb +16 -25
  31. data/lib/sem4r/ad_group_ad/ad_group_text_ad.rb +18 -14
  32. data/lib/sem4r/ad_group_criterion/ad_group_criterion.rb +27 -19
  33. data/lib/sem4r/ad_group_criterion/ad_group_criterion_bids.rb +2 -1
  34. data/lib/sem4r/ad_group_criterion/ad_group_criterion_operations.rb +1 -0
  35. data/lib/sem4r/ad_group_criterion/ad_group_criterion_service.rb +9 -4
  36. data/lib/sem4r/ad_group_criterion/criterion.rb +1 -0
  37. data/lib/sem4r/ad_group_criterion/criterion_keyword.rb +1 -0
  38. data/lib/sem4r/ad_group_criterion/criterion_placement.rb +1 -0
  39. data/lib/sem4r/ad_param/ad_param.rb +24 -8
  40. data/lib/sem4r/ad_param/ad_param_service.rb +8 -5
  41. data/lib/sem4r/adwords.rb +232 -76
  42. data/lib/sem4r/base.rb +1 -1
  43. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job.rb +41 -35
  44. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job_account_extension.rb +49 -15
  45. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job_selector.rb +29 -20
  46. data/lib/sem4r/bulk_mutate_job/bulk_mutate_job_service.rb +13 -14
  47. data/lib/sem4r/bulk_mutate_job/job_operations.rb +1 -1
  48. data/lib/sem4r/campaign/campaign.rb +1 -0
  49. data/lib/sem4r/campaign/campaign_account_extension.rb +2 -1
  50. data/lib/sem4r/campaign/campaign_service.rb +9 -5
  51. data/lib/sem4r/credentials.rb +11 -5
  52. data/lib/sem4r/geo_location/address.rb +56 -0
  53. data/lib/sem4r/geo_location/geo_location_account_extension.rb +27 -6
  54. data/lib/sem4r/geo_location/geo_location_selector.rb +57 -0
  55. data/lib/sem4r/geo_location/geo_location_service.rb +9 -16
  56. data/lib/sem4r/info/info_account_extension.rb +3 -2
  57. data/lib/sem4r/info/info_selector.rb +2 -1
  58. data/lib/sem4r/info/info_service.rb +10 -3
  59. data/lib/sem4r/operation.rb +39 -20
  60. data/lib/sem4r/report_definition/report_definition.rb +37 -19
  61. data/lib/sem4r/report_definition/report_definition_account_extension.rb +66 -16
  62. data/lib/sem4r/report_definition/report_definition_operation.rb +2 -2
  63. data/lib/sem4r/report_definition/report_definition_selector.rb +1 -1
  64. data/lib/sem4r/report_definition/report_definition_service.rb +11 -7
  65. data/lib/sem4r/report_definition/report_field.rb +3 -2
  66. data/lib/sem4r/sem4r_templates.rb +77 -0
  67. data/lib/sem4r/{services/service.rb → service.rb} +23 -23
  68. data/lib/sem4r/targeting_idea/targeting_idea.rb +4 -4
  69. data/lib/sem4r/targeting_idea/targeting_idea_account_extension.rb +1 -1
  70. data/lib/sem4r/targeting_idea/targeting_idea_selector.rb +6 -6
  71. data/lib/sem4r/targeting_idea/targeting_idea_service.rb +7 -5
  72. data/lib/sem4r/v13_account/account_account_extension.rb +7 -10
  73. data/lib/sem4r/v13_account/account_service.rb +10 -4
  74. data/lib/sem4r/v13_account/billing_address.rb +2 -2
  75. data/lib/sem4r/v13_report/report_service.rb +11 -9
  76. data/lib/sem4r.rb +46 -31
  77. data/lib/{sem4r/cli → sem4r_cli}/cli_helpers.rb +3 -2
  78. data/lib/{sem4r/cli/cli_command.rb → sem4r_cli/cli_mini_framework.rb} +77 -32
  79. data/lib/{sem4r/cli/cli_common_args.rb → sem4r_cli/cli_sem.rb} +177 -157
  80. data/lib/{sem4r/cli/commands/cli_list_ads.rb → sem4r_cli/commands/cli_ads.rb} +7 -9
  81. data/lib/sem4r_cli/commands/cli_campaign.rb +69 -0
  82. data/lib/{sem4r/cli/commands/cli_list_client.rb → sem4r_cli/commands/cli_clients.rb} +2 -2
  83. data/lib/{sem4r/cli → sem4r_cli}/commands/cli_ideas.rb +35 -27
  84. data/lib/{sem4r/cli → sem4r_cli}/commands/cli_info.rb +3 -4
  85. data/lib/{sem4r/cli/commands/cli_repdef.rb → sem4r_cli/commands/cli_job.rb} +57 -55
  86. data/lib/{sem4r/cli/commands/cli_list_keywords.rb → sem4r_cli/commands/cli_keywords.rb} +14 -13
  87. data/lib/sem4r_cli/commands/cli_profile.rb +138 -0
  88. data/lib/{sem4r/cli/commands/cli_report.rb → sem4r_cli/commands/cli_repdef.rb} +67 -20
  89. data/lib/{sem4r/cli/commands/cli_request_report.rb → sem4r_cli/commands/cli_report.rb} +82 -19
  90. data/lib/sem4r_cli.rb +5 -7
  91. data/lib/sem4r_soap/http_connector.rb +206 -0
  92. data/lib/{soap_helpers → sem4r_soap}/soap_attributes.rb +8 -3
  93. data/lib/{sem4r/services → sem4r_soap}/soap_dumper.rb +36 -20
  94. data/lib/{sem4r/services → sem4r_soap}/soap_error.rb +5 -2
  95. data/lib/sem4r_soap/soap_response.rb +75 -0
  96. data/lib/sem4r_soap/soap_service.rb +137 -0
  97. data/lib/{sem4r/cli/cli_sem.rb → sem4r_soap/soap_service_v13.rb} +27 -28
  98. data/lib/sem4r_soap/soap_service_v2010.rb +80 -0
  99. data/lib/sem4r_soap.rb +17 -0
  100. data/sem4r.gemspec +93 -58
  101. data/spec/build_fixtures.rb +49 -42
  102. data/spec/fixtures/password.example.yml +3 -0
  103. data/spec/fixtures/sem4r.example.yml +6 -0
  104. data/spec/fixtures/{services/error.xml → soap_error.xml} +0 -0
  105. data/spec/fixtures/soap_error2.xml +29 -0
  106. data/spec/helpers/dump_interceptor.rb +90 -0
  107. data/spec/helpers/fixtures_bulk_mutate_job.rb +48 -0
  108. data/spec/helpers/fixtures_geo_location.rb +45 -0
  109. data/{lib/sem4r/campaign_criterion/campaign_criterion_service.rb → spec/helpers/fixtures_info.rb} +10 -6
  110. data/spec/helpers/fixtures_report_definition.rb +65 -0
  111. data/spec/{rspec_hash.rb → helpers/rspec_hash.rb} +1 -0
  112. data/spec/{rspec_matchers.rb → helpers/rspec_matchers.rb} +46 -19
  113. data/spec/{rspec_sem4r_helper.rb → helpers/rspec_sem4r_helper.rb} +19 -16
  114. data/spec/{sem4r_stubs.rb → helpers/sem4r_stubs.rb} +5 -4
  115. data/spec/rspec_helper.rb +4 -4
  116. data/spec/sem4r/account_spec.rb +2 -3
  117. data/spec/sem4r/ad_group/ad_group_service_spec.rb +1 -1
  118. data/spec/sem4r/ad_group/ad_group_spec.rb +1 -1
  119. data/spec/sem4r/ad_group_ad/ad_group_ad_operation_spec.rb +3 -3
  120. data/spec/sem4r/adwords_spec.rb +62 -39
  121. data/{lib/sem4r/cli/commands/cli_list_campaign.rb → spec/sem4r/bulk_mutate_job/bulk_mutate_job_selector_spec.rb} +14 -11
  122. data/spec/sem4r/bulk_mutate_job/bulk_mutate_job_service_spec.rb +2 -3
  123. data/spec/sem4r/bulk_mutate_job/bulk_mutate_job_spec.rb +23 -17
  124. data/spec/sem4r/bulk_mutate_job/fixtures/get-list_job-req.xml +35 -0
  125. data/spec/sem4r/bulk_mutate_job/fixtures/get-list_job-res.xml +417 -0
  126. data/spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-req.xml +106 -0
  127. data/spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-res.xml +48 -0
  128. data/spec/sem4r/bulk_mutate_job/job_operation_spec.rb +5 -7
  129. data/spec/sem4r/campaign/campaign_service_spec.rb +2 -2
  130. data/spec/sem4r/credentials_spec.rb +10 -8
  131. data/spec/sem4r/geo_location/address_spec.rb +62 -0
  132. data/spec/sem4r/geo_location/fixtures/get-req.xml +42 -0
  133. data/spec/sem4r/geo_location/fixtures/get-res.xml +60 -0
  134. data/spec/sem4r/info/fixtures/get-req.xml +34 -0
  135. data/spec/sem4r/info/fixtures/get-res.xml +27 -0
  136. data/spec/sem4r/nokogiri_parsing_spec.rb +1 -0
  137. data/spec/sem4r/operation_spec.rb +72 -0
  138. data/spec/sem4r/report_definition/fixtures/get-list-repdef-req.xml +22 -0
  139. data/spec/sem4r/report_definition/fixtures/get-list-repdef-res.xml +73 -0
  140. data/spec/sem4r/report_definition/fixtures/getReportFields-req.xml +24 -0
  141. data/spec/sem4r/report_definition/fixtures/getReportFields-res.xml +1199 -0
  142. data/spec/sem4r/report_definition/fixtures/mutate-add-report-req.xml +63 -0
  143. data/spec/sem4r/report_definition/fixtures/mutate-add-report-res.xml +68 -0
  144. data/spec/sem4r/report_definition/report_definition_service_spec.rb +5 -5
  145. data/spec/sem4r/report_definition/report_definition_spec.rb +28 -43
  146. data/{lib/sem4r/cli/commands/cli_list_report.rb → spec/sem4r/report_definition/report_field_spec.rb} +12 -10
  147. data/spec/sem4r/rexml_parsing_spec.rb +1 -0
  148. data/spec/sem4r/{services/service_spec.rb → service_spec.rb} +1 -1
  149. data/spec/sem4r/targeting_idea/targeting_idea_selector_spec.rb +1 -1
  150. data/spec/sem4r/targeting_idea/targeting_idea_service_spec.rb +1 -1
  151. data/spec/sem4r/targeting_idea/targeting_idea_spec.rb +1 -1
  152. data/spec/sem4r/v13_account/account_service_spec.rb +2 -2
  153. data/spec/sem4r/v13_report/report_service_spec.rb +2 -2
  154. data/spec/{sem4r/cli → sem4r_cli}/cli_spec.rb +22 -27
  155. data/spec/{soap_helpers → sem4r_soap}/soap_attributes_spec.rb +3 -3
  156. data/spec/{sem4r/services/soap_message_v13_spec.rb → sem4r_soap/soap_response_spec.rb} +10 -15
  157. data/spec/{sem4r/services/soap_call_spec.rb → sem4r_soap/soap_service_spec.rb} +35 -54
  158. data/tasks/jeweler.rake +66 -0
  159. data/tasks/rspec.rake +21 -0
  160. data/tasks/sem4r.rake +25 -0
  161. data/tasks/yard.rake +31 -0
  162. metadata +173 -76
  163. data/lib/sem4r/ad_extension_override/ad_extension_override_service.rb +0 -30
  164. data/lib/sem4r/api_counters.rb +0 -8
  165. data/lib/sem4r/campaign_target/campaign_target_service.rb +0 -30
  166. data/lib/sem4r/cli/commands/cli_download_report.rb +0 -82
  167. data/lib/sem4r/services/http_connector.rb +0 -93
  168. data/lib/sem4r/services/soap_call.rb +0 -122
  169. data/lib/sem4r/services/soap_connector.rb +0 -139
  170. data/lib/sem4r/services/soap_message_v13.rb +0 -135
  171. data/lib/sem4r/services/soap_message_v2010.rb +0 -184
  172. data/lib/sem4r/v13_traffic_estimator/traffic_estimator_service.rb +0 -30
  173. data/spec/aggregates_rspec_helper.rb +0 -59
  174. data/spec/sem4r/report_definition/fixtures/mutate_add-req.xml +0 -24
  175. data/spec/sem4r/report_definition/fixtures/mutate_add-req_orig.xml +0 -45
@@ -0,0 +1,80 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -------------------------------------------------------------------
3
+ # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ # -------------------------------------------------------------------
24
+
25
+ module Sem4rSoap
26
+
27
+ class SoapServiceV2010 < SoapService
28
+
29
+ def initialize
30
+ super
31
+ end
32
+
33
+ def self.soap_call(method, options = {})
34
+ _soap_call("v2010", method, options)
35
+ end
36
+
37
+ private
38
+
39
+ def build_soap_header(credentials)
40
+ s = if @service_namespace then "s:" else "" end
41
+ auth_token = credentials.authentication_token
42
+
43
+ str = "<env:Header>"
44
+ str += "<#{s}RequestHeader env:mustUnderstand=\"0\">"
45
+
46
+ str +="<authToken>#{auth_token}</authToken>"
47
+ str +="<userAgent>#{credentials.useragent}</userAgent>"
48
+ str +="<developerToken>#{credentials.developer_token}</developerToken>"
49
+
50
+ if credentials.client_email
51
+ str += "<clientEmail>#{credentials.client_email}</clientEmail>"
52
+ end
53
+
54
+ str += "</#{s}RequestHeader>"
55
+ str += "</env:Header>"
56
+ str
57
+ end
58
+
59
+ def _send(service_url, soap_action, soap_xml)
60
+ _send_raw(service_url, soap_xml)
61
+ end
62
+
63
+ def send_raw(service_url, soap_message)
64
+ soap_message = soap_message.dup
65
+ soap_message.gsub!(/\{authentication_token\}/, @credentials.authentication_token)
66
+ soap_message.gsub!(/\{useragent\}/, @credentials.useragent)
67
+ soap_message.gsub!(/\{developer_token\}/, @credentials.developer_token)
68
+ # soap_message.gsub!(/{client_email}/, @credentials.client_email)
69
+ _send_raw(service_url, soap_message)
70
+ end
71
+
72
+ def _send_raw(service_url, soap_message)
73
+ response_xml = @connector.send(service_url, "", soap_message)
74
+ soap_response = SoapResponse.new.parse_response(response_xml)
75
+ soap_response
76
+ end
77
+
78
+ end
79
+
80
+ end
data/lib/sem4r_soap.rb ADDED
@@ -0,0 +1,17 @@
1
+ #
2
+ # soap connection layer
3
+ #
4
+
5
+ require 'rubygems'
6
+ require 'uri'
7
+ require 'open-uri'
8
+ # require 'net/https'
9
+ require 'httpclient'
10
+
11
+ require 'sem4r_soap/soap_error'
12
+ require 'sem4r_soap/soap_dumper'
13
+ require 'sem4r_soap/http_connector'
14
+ require 'sem4r_soap/soap_response'
15
+ require 'sem4r_soap/soap_service'
16
+ require 'sem4r_soap/soap_service_v13'
17
+ require 'sem4r_soap/soap_service_v2010'
data/sem4r.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sem4r}
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sem4r"]
12
- s.date = %q{2010-11-28}
12
+ s.date = %q{2010-12-11}
13
13
  s.default_executable = %q{sem}
14
14
  s.description = %q{
15
15
  Sem4r is a library to access google adwords api.
@@ -45,21 +45,20 @@ Gem::Specification.new do |s|
45
45
  "examples_sem4r/03_list_ad.rb",
46
46
  "examples_sem4r/04_list_keywords.rb",
47
47
  "examples_sem4r/05_request_report.rb",
48
- "examples_sem4r/05_request_report_2010.rb",
49
- "examples_sem4r/06_create_campaigns.rb",
50
- "examples_sem4r/07_create_campaigns_block.rb",
51
- "examples_sem4r/07_create_campaigns_simple.rb",
52
- "examples_sem4r/08_ad_params.rb",
53
- "examples_sem4r/09_targeting_idea.rb",
54
- "examples_sem4r/10_get_location.rb",
55
- "examples_sem4r/11_submit_bulk_job.rb",
56
- "examples_sem4r/12_list_bulk_job.rb",
48
+ "examples_sem4r/06_request_report_definition.rb",
49
+ "examples_sem4r/07_create_campaigns.rb",
50
+ "examples_sem4r/08_create_campaigns_block.rb",
51
+ "examples_sem4r/09_create_campaigns_simple.rb",
52
+ "examples_sem4r/10_ad_params.rb",
53
+ "examples_sem4r/11_targeting_idea.rb",
54
+ "examples_sem4r/12_get_location.rb",
55
+ "examples_sem4r/13_submit_bulk_job.rb",
56
+ "examples_sem4r/14_list_bulk_job.rb",
57
57
  "examples_sem4r/30_prune_empty_adgroup.rb",
58
58
  "examples_sem4r/31_empty_accounts.rb",
59
59
  "examples_sem4r/example_helper.rb",
60
60
  "lib/sem4r.rb",
61
61
  "lib/sem4r/account.rb",
62
- "lib/sem4r/ad_extension_override/ad_extension_override_service.rb",
63
62
  "lib/sem4r/ad_group/ad_group.rb",
64
63
  "lib/sem4r/ad_group/ad_group_bids.rb",
65
64
  "lib/sem4r/ad_group/ad_group_service.rb",
@@ -80,7 +79,6 @@ Gem::Specification.new do |s|
80
79
  "lib/sem4r/ad_param/ad_param_operation.rb",
81
80
  "lib/sem4r/ad_param/ad_param_service.rb",
82
81
  "lib/sem4r/adwords.rb",
83
- "lib/sem4r/api_counters.rb",
84
82
  "lib/sem4r/base.rb",
85
83
  "lib/sem4r/bulk_mutate_job/bulk_mutate_job.rb",
86
84
  "lib/sem4r/bulk_mutate_job/bulk_mutate_job_account_extension.rb",
@@ -90,26 +88,11 @@ Gem::Specification.new do |s|
90
88
  "lib/sem4r/campaign/campaign.rb",
91
89
  "lib/sem4r/campaign/campaign_account_extension.rb",
92
90
  "lib/sem4r/campaign/campaign_service.rb",
93
- "lib/sem4r/campaign_criterion/campaign_criterion_service.rb",
94
- "lib/sem4r/campaign_target/campaign_target_service.rb",
95
- "lib/sem4r/cli/cli_command.rb",
96
- "lib/sem4r/cli/cli_common_args.rb",
97
- "lib/sem4r/cli/cli_helpers.rb",
98
- "lib/sem4r/cli/cli_sem.rb",
99
- "lib/sem4r/cli/commands/cli_download_report.rb",
100
- "lib/sem4r/cli/commands/cli_ideas.rb",
101
- "lib/sem4r/cli/commands/cli_info.rb",
102
- "lib/sem4r/cli/commands/cli_list_ads.rb",
103
- "lib/sem4r/cli/commands/cli_list_campaign.rb",
104
- "lib/sem4r/cli/commands/cli_list_client.rb",
105
- "lib/sem4r/cli/commands/cli_list_keywords.rb",
106
- "lib/sem4r/cli/commands/cli_list_report.rb",
107
- "lib/sem4r/cli/commands/cli_repdef.rb",
108
- "lib/sem4r/cli/commands/cli_report.rb",
109
- "lib/sem4r/cli/commands/cli_request_report.rb",
110
91
  "lib/sem4r/credentials.rb",
111
92
  "lib/sem4r/extensions.rb",
93
+ "lib/sem4r/geo_location/address.rb",
112
94
  "lib/sem4r/geo_location/geo_location_account_extension.rb",
95
+ "lib/sem4r/geo_location/geo_location_selector.rb",
113
96
  "lib/sem4r/geo_location/geo_location_service.rb",
114
97
  "lib/sem4r/info/info_account_extension.rb",
115
98
  "lib/sem4r/info/info_selector.rb",
@@ -122,14 +105,8 @@ Gem::Specification.new do |s|
122
105
  "lib/sem4r/report_definition/report_definition_service.rb",
123
106
  "lib/sem4r/report_definition/report_field.rb",
124
107
  "lib/sem4r/sem4r_error.rb",
125
- "lib/sem4r/services/http_connector.rb",
126
- "lib/sem4r/services/service.rb",
127
- "lib/sem4r/services/soap_call.rb",
128
- "lib/sem4r/services/soap_connector.rb",
129
- "lib/sem4r/services/soap_dumper.rb",
130
- "lib/sem4r/services/soap_error.rb",
131
- "lib/sem4r/services/soap_message_v13.rb",
132
- "lib/sem4r/services/soap_message_v2010.rb",
108
+ "lib/sem4r/sem4r_templates.rb",
109
+ "lib/sem4r/service.rb",
133
110
  "lib/sem4r/targeting_idea/targeting_idea.rb",
134
111
  "lib/sem4r/targeting_idea/targeting_idea_account_extension.rb",
135
112
  "lib/sem4r/targeting_idea/targeting_idea_selector.rb",
@@ -141,24 +118,55 @@ Gem::Specification.new do |s|
141
118
  "lib/sem4r/v13_report/report_account_extension.rb",
142
119
  "lib/sem4r/v13_report/report_job.rb",
143
120
  "lib/sem4r/v13_report/report_service.rb",
144
- "lib/sem4r/v13_traffic_estimator/traffic_estimator_service.rb",
145
121
  "lib/sem4r_cli.rb",
146
- "lib/soap_helpers/soap_attributes.rb",
147
- "sem4r.gemspec"
122
+ "lib/sem4r_cli/cli_helpers.rb",
123
+ "lib/sem4r_cli/cli_mini_framework.rb",
124
+ "lib/sem4r_cli/cli_sem.rb",
125
+ "lib/sem4r_cli/commands/cli_ads.rb",
126
+ "lib/sem4r_cli/commands/cli_campaign.rb",
127
+ "lib/sem4r_cli/commands/cli_clients.rb",
128
+ "lib/sem4r_cli/commands/cli_ideas.rb",
129
+ "lib/sem4r_cli/commands/cli_info.rb",
130
+ "lib/sem4r_cli/commands/cli_job.rb",
131
+ "lib/sem4r_cli/commands/cli_keywords.rb",
132
+ "lib/sem4r_cli/commands/cli_profile.rb",
133
+ "lib/sem4r_cli/commands/cli_repdef.rb",
134
+ "lib/sem4r_cli/commands/cli_report.rb",
135
+ "lib/sem4r_soap.rb",
136
+ "lib/sem4r_soap/http_connector.rb",
137
+ "lib/sem4r_soap/soap_attributes.rb",
138
+ "lib/sem4r_soap/soap_dumper.rb",
139
+ "lib/sem4r_soap/soap_error.rb",
140
+ "lib/sem4r_soap/soap_response.rb",
141
+ "lib/sem4r_soap/soap_service.rb",
142
+ "lib/sem4r_soap/soap_service_v13.rb",
143
+ "lib/sem4r_soap/soap_service_v2010.rb",
144
+ "sem4r.gemspec",
145
+ "tasks/jeweler.rake",
146
+ "tasks/rspec.rake",
147
+ "tasks/sem4r.rake",
148
+ "tasks/yard.rake"
148
149
  ]
149
150
  s.homepage = %q{http://www.sem4r.com}
150
151
  s.require_paths = ["lib"]
151
152
  s.rubygems_version = %q{1.3.7}
152
153
  s.summary = %q{Library to access google adwords api. Works with ruby 1.9 and ruby 1.8}
153
154
  s.test_files = [
154
- "spec/aggregates_rspec_helper.rb",
155
155
  "spec/build_fixtures.rb",
156
+ "spec/fixtures/password.example.yml",
156
157
  "spec/fixtures/sem4r.example.yml",
157
- "spec/fixtures/services/error.xml",
158
- "spec/rspec_hash.rb",
158
+ "spec/fixtures/soap_error.xml",
159
+ "spec/fixtures/soap_error2.xml",
160
+ "spec/helpers/dump_interceptor.rb",
161
+ "spec/helpers/fixtures_bulk_mutate_job.rb",
162
+ "spec/helpers/fixtures_geo_location.rb",
163
+ "spec/helpers/fixtures_info.rb",
164
+ "spec/helpers/fixtures_report_definition.rb",
165
+ "spec/helpers/rspec_hash.rb",
166
+ "spec/helpers/rspec_matchers.rb",
167
+ "spec/helpers/rspec_sem4r_helper.rb",
168
+ "spec/helpers/sem4r_stubs.rb",
159
169
  "spec/rspec_helper.rb",
160
- "spec/rspec_matchers.rb",
161
- "spec/rspec_sem4r_helper.rb",
162
170
  "spec/sem4r/account_spec.rb",
163
171
  "spec/sem4r/ad_group/ad_group_bids_spec.rb",
164
172
  "spec/sem4r/ad_group/ad_group_service_spec.rb",
@@ -199,10 +207,15 @@ Gem::Specification.new do |s|
199
207
  "spec/sem4r/ad_param/fixtures/mutate_set-req.xml",
200
208
  "spec/sem4r/ad_param/fixtures/mutate_set-res.xml",
201
209
  "spec/sem4r/adwords_spec.rb",
210
+ "spec/sem4r/bulk_mutate_job/bulk_mutate_job_selector_spec.rb",
202
211
  "spec/sem4r/bulk_mutate_job/bulk_mutate_job_service_spec.rb",
203
212
  "spec/sem4r/bulk_mutate_job/bulk_mutate_job_spec.rb",
213
+ "spec/sem4r/bulk_mutate_job/fixtures/get-list_job-req.xml",
214
+ "spec/sem4r/bulk_mutate_job/fixtures/get-list_job-res.xml",
204
215
  "spec/sem4r/bulk_mutate_job/fixtures/get-req.xml",
205
216
  "spec/sem4r/bulk_mutate_job/fixtures/get-res.xml",
217
+ "spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-req.xml",
218
+ "spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-res.xml",
206
219
  "spec/sem4r/bulk_mutate_job/fixtures/mutate-req.xml",
207
220
  "spec/sem4r/bulk_mutate_job/fixtures/mutate-res.xml",
208
221
  "spec/sem4r/bulk_mutate_job/job_operation_spec.rb",
@@ -212,20 +225,28 @@ Gem::Specification.new do |s|
212
225
  "spec/sem4r/campaign/fixtures/get-res.xml",
213
226
  "spec/sem4r/campaign/fixtures/mutate_add-req.xml",
214
227
  "spec/sem4r/campaign/fixtures/mutate_add-res.xml",
215
- "spec/sem4r/cli/cli_spec.rb",
216
228
  "spec/sem4r/credentials_spec.rb",
229
+ "spec/sem4r/geo_location/address_spec.rb",
230
+ "spec/sem4r/geo_location/fixtures/get-req.xml",
231
+ "spec/sem4r/geo_location/fixtures/get-res.xml",
217
232
  "spec/sem4r/info/account_info_extension_spec.rb",
233
+ "spec/sem4r/info/fixtures/get-req.xml",
234
+ "spec/sem4r/info/fixtures/get-res.xml",
218
235
  "spec/sem4r/info/fixtures/get_unit_count-req.xml",
219
236
  "spec/sem4r/info/fixtures/get_unit_count-res.xml",
220
237
  "spec/sem4r/nokogiri_parsing_spec.rb",
221
- "spec/sem4r/report_definition/fixtures/mutate_add-req.xml",
222
- "spec/sem4r/report_definition/fixtures/mutate_add-req_orig.xml",
238
+ "spec/sem4r/operation_spec.rb",
239
+ "spec/sem4r/report_definition/fixtures/get-list-repdef-req.xml",
240
+ "spec/sem4r/report_definition/fixtures/get-list-repdef-res.xml",
241
+ "spec/sem4r/report_definition/fixtures/getReportFields-req.xml",
242
+ "spec/sem4r/report_definition/fixtures/getReportFields-res.xml",
243
+ "spec/sem4r/report_definition/fixtures/mutate-add-report-req.xml",
244
+ "spec/sem4r/report_definition/fixtures/mutate-add-report-res.xml",
223
245
  "spec/sem4r/report_definition/report_definition_service_spec.rb",
224
246
  "spec/sem4r/report_definition/report_definition_spec.rb",
247
+ "spec/sem4r/report_definition/report_field_spec.rb",
225
248
  "spec/sem4r/rexml_parsing_spec.rb",
226
- "spec/sem4r/services/service_spec.rb",
227
- "spec/sem4r/services/soap_call_spec.rb",
228
- "spec/sem4r/services/soap_message_v13_spec.rb",
249
+ "spec/sem4r/service_spec.rb",
229
250
  "spec/sem4r/targeting_idea/fixtures/get-req-all-options.xml",
230
251
  "spec/sem4r/targeting_idea/fixtures/get-req.xml",
231
252
  "spec/sem4r/targeting_idea/fixtures/get-res.xml",
@@ -245,8 +266,10 @@ Gem::Specification.new do |s|
245
266
  "spec/sem4r/v13_report/fixtures/schedule_report_job-res.xml",
246
267
  "spec/sem4r/v13_report/report_service_spec.rb",
247
268
  "spec/sem4r/v13_report/report_spec.rb",
248
- "spec/sem4r_stubs.rb",
249
- "spec/soap_helpers/soap_attributes_spec.rb"
269
+ "spec/sem4r_cli/cli_spec.rb",
270
+ "spec/sem4r_soap/soap_attributes_spec.rb",
271
+ "spec/sem4r_soap/soap_response_spec.rb",
272
+ "spec/sem4r_soap/soap_service_spec.rb"
250
273
  ]
251
274
 
252
275
  if s.respond_to? :specification_version then
@@ -255,18 +278,26 @@ Gem::Specification.new do |s|
255
278
 
256
279
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
257
280
  s.add_runtime_dependency(%q<builder>, [">= 0"])
258
- s.add_runtime_dependency(%q<jeweler>, [">= 0"])
259
- s.add_runtime_dependency(%q<rake>, [">= 0"])
260
281
  s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
282
+ s.add_runtime_dependency(%q<httpclient>, [">= 0"])
283
+ s.add_runtime_dependency(%q<highline>, [">= 0"])
284
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
285
+ s.add_development_dependency(%q<rake>, [">= 0"])
286
+ s.add_development_dependency(%q<yard>, [">= 0"])
287
+ s.add_development_dependency(%q<bundler>, [">= 0"])
261
288
  s.add_runtime_dependency(%q<builder>, [">= 0"])
262
289
  s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
263
290
  s.add_development_dependency(%q<rspec>, [">= 0"])
264
291
  s.add_development_dependency(%q<differ>, [">= 0"])
265
292
  else
266
293
  s.add_dependency(%q<builder>, [">= 0"])
294
+ s.add_dependency(%q<nokogiri>, [">= 0"])
295
+ s.add_dependency(%q<httpclient>, [">= 0"])
296
+ s.add_dependency(%q<highline>, [">= 0"])
267
297
  s.add_dependency(%q<jeweler>, [">= 0"])
268
298
  s.add_dependency(%q<rake>, [">= 0"])
269
- s.add_dependency(%q<nokogiri>, [">= 0"])
299
+ s.add_dependency(%q<yard>, [">= 0"])
300
+ s.add_dependency(%q<bundler>, [">= 0"])
270
301
  s.add_dependency(%q<builder>, [">= 0"])
271
302
  s.add_dependency(%q<nokogiri>, [">= 0"])
272
303
  s.add_dependency(%q<rspec>, [">= 0"])
@@ -274,9 +305,13 @@ Gem::Specification.new do |s|
274
305
  end
275
306
  else
276
307
  s.add_dependency(%q<builder>, [">= 0"])
308
+ s.add_dependency(%q<nokogiri>, [">= 0"])
309
+ s.add_dependency(%q<httpclient>, [">= 0"])
310
+ s.add_dependency(%q<highline>, [">= 0"])
277
311
  s.add_dependency(%q<jeweler>, [">= 0"])
278
312
  s.add_dependency(%q<rake>, [">= 0"])
279
- s.add_dependency(%q<nokogiri>, [">= 0"])
313
+ s.add_dependency(%q<yard>, [">= 0"])
314
+ s.add_dependency(%q<bundler>, [">= 0"])
280
315
  s.add_dependency(%q<builder>, [">= 0"])
281
316
  s.add_dependency(%q<nokogiri>, [">= 0"])
282
317
  s.add_dependency(%q<rspec>, [">= 0"])
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  # -------------------------------------------------------------------
2
3
  # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
3
4
  #
@@ -22,63 +23,69 @@
22
23
  # -------------------------------------------------------------------
23
24
 
24
25
  require 'rubygems'
25
-
26
- cwd = File.expand_path( File.join( File.dirname(__FILE__), "..", "lib" ) )
26
+ cwd = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
27
+ $:.unshift(cwd) unless $:.include?(cwd)
28
+ cwd = File.expand_path(File.dirname(__FILE__))
27
29
  $:.unshift(cwd) unless $:.include?(cwd)
30
+
28
31
  require 'sem4r'
29
32
  include Sem4r
30
33
 
31
- puts "---------------------------------------------------------------------"
32
- puts "Building fixtures"
33
- puts "---------------------------------------------------------------------"
34
+ require 'helpers/rspec_sem4r_helper'
35
+ require 'helpers/dump_interceptor'
36
+ require 'helpers/fixtures_geo_location'
37
+ require 'helpers/fixtures_report_definition'
38
+ require 'helpers/fixtures_bulk_mutate_job'
39
+ require 'helpers/fixtures_info'
34
40
 
41
+ class BuildFixtures
42
+ include FixtureGeoLocation
43
+ include FixtureReportDefinition
44
+ include FixtureBulkMutateJob
45
+ include FixtureInfo
35
46
 
36
- class DumpInterceptor
47
+ def initialize
48
+ @adwords = Adwords.sandbox # search credentials into ~/.sem4r file
37
49
 
38
- def initialize(dir)
39
- @dir = dir
40
- end
50
+ log_directory = File.join(File.dirname(__FILE__), "..", "tmp", "build_fixtures")
51
+ log_directory = File.expand_path(log_directory)
52
+ Dir.mkdir(log_directory) unless File.directory?(log_directory)
53
+ puts "dump soap messages in '#{log_directory}'"
41
54
 
42
- def call(service_url, type, str)
43
- # puts "dump interceptor #{service_url} #{type}"
55
+ fixtures_dir = File.join(File.dirname(__FILE__), "fixtures", "services")
56
+ @dump_interceptor = DumpInterceptor.new(fixtures_dir)
57
+ dump_options = {:directory => log_directory, :format => true, :interceptor => @dump_interceptor}
58
+ @adwords.dump_soap_options(dump_options)
59
+ @adwords.logger = Logger.new(STDOUT)
60
+ end
44
61
 
45
- # https://adwords-sandbox.google.com/api/adwords/info/v201008/InfoService
46
- match_data = service_url.match(/https:\/\/adwords-sandbox.google.com\/api\/adwords\/info\/v201008\/([^\/]*)$/)
47
- case match_data[1]
48
- when "InfoService"
49
- dir = File.join(@dir, "info")
50
- FileUtils.mkdir_p(dir) unless File.directory?(dir)
51
- pathname = File.join(dir, "get_unit_count-#{type}.xml")
52
- puts "writing to #{pathname}"
53
- File.open(pathname, "w") {|f|
54
- f.puts str
55
- }
56
- else
57
- puts "unknow service #{match_data[1]}"
62
+ def intercept(p1, p2 = nil)
63
+ if block_given?
64
+ @dump_interceptor.intercept_to(p1, p2)
65
+ @dump_interceptor.start
66
+ yield
67
+ @dump_interceptor.stop
58
68
  end
59
-
60
69
  end
61
- end
62
70
 
63
- begin
64
- adwords = Adwords.sandbox # search credentials into ~/.sem4r file
71
+ def run
72
+ puts "---------------------------------------------------------------------"
73
+ puts "Building fixtures"
74
+ puts "---------------------------------------------------------------------"
75
+ begin
65
76
 
66
- log_directory = File.join( File.dirname(__FILE__), "..", "tmp", "build_fixtures" )
67
- log_directory = File.expand_path(log_directory)
68
- Dir.mkdir(log_directory) unless File.directory?(log_directory)
69
- puts "dump soap messages in '#{log_directory}'"
77
+ fixtures_info
78
+ fixtures_geo_location
79
+ fixtures_report_definition
80
+ fixtures_bulk_mutate_job
70
81
 
71
- fixtures_dir = File.join( File.dirname(__FILE__), "fixtures", "services")
72
- interceptor = DumpInterceptor.new(fixtures_dir)
73
- dump_options = { :directory => log_directory, :format => true, :interceptor => interceptor}
74
- adwords.dump_soap_options( dump_options )
75
- adwords.logger = Logger.new(STDOUT)
82
+ rescue Sem4rError
83
+ puts "I am so sorry! Something went wrong! (exception #{$!.to_s})"
84
+ end
85
+ puts "---------------------------------------------------------------------"
86
+ end
76
87
 
77
- # info
78
- adwords.account.year_unit_cost(InfoSelector::UNIT_COUNT)
79
88
 
80
- rescue Sem4rError
81
- puts "I am so sorry! Something went wrong! (exception #{$!.to_s})"
82
89
  end
83
90
 
84
- puts "---------------------------------------------------------------------"
91
+ BuildFixtures.new.run
@@ -0,0 +1,3 @@
1
+ ---
2
+ env_wo_password@gmail.com: env_password
3
+ example@gmail.com: password
@@ -24,3 +24,9 @@ google_adwords:
24
24
  email: production@anothersite.com
25
25
  password: password
26
26
  developer_token: productiondevelopertoken
27
+
28
+ env_wo_password:
29
+ environment: sandbox
30
+ email: env_wo_password@gmail.com
31
+ developer_token: env_wo_password@gmail.com++EUR
32
+
@@ -0,0 +1,29 @@
1
+
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
3
+ <soap:Header>
4
+ <ResponseHeader xmlns="https://adwords.google.com/api/adwords/cm/v200909">
5
+ <requestId>e7c3b00f339bcaf56b7df47db97efdb7</requestId>
6
+ <operations>1</operations>
7
+ <responseTime>231</responseTime>
8
+ <units>1</units>
9
+ </ResponseHeader>
10
+ </soap:Header>
11
+ <soap:Body>
12
+ <soap:Fault>
13
+ <faultcode>soap:Server</faultcode>
14
+ <faultstring>[CampaignError.DUPLICATE_CAMPAIGN_NAME @ operations[0].operand.name]</faultstring>
15
+ <detail>
16
+ <ApiExceptionFault xmlns="https://adwords.google.com/api/adwords/cm/v200909">
17
+ <message>[CampaignError.DUPLICATE_CAMPAIGN_NAME @ operations[0].operand.name]</message>
18
+ <ApplicationException.Type>ApiException</ApplicationException.Type>
19
+ <errors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CampaignError">
20
+ <fieldPath>operations[0].operand.name</fieldPath>
21
+ <trigger></trigger>
22
+ <ApiError.Type>CampaignError</ApiError.Type>
23
+ <reason>DUPLICATE_CAMPAIGN_NAME</reason>
24
+ </errors>
25
+ </ApiExceptionFault>
26
+ </detail>
27
+ </soap:Fault>
28
+ </soap:Body>
29
+ </soap:Envelope>
@@ -0,0 +1,90 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -------------------------------------------------------------------------
3
+ # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ # -------------------------------------------------------------------------
24
+
25
+ class DumpInterceptor
26
+ include Sem4rSpecHelper
27
+
28
+ def reset_and_start
29
+ @request_number = 0
30
+ @where_to_write = []
31
+ @state = :started
32
+ end
33
+
34
+ def reset_and_stop
35
+ @request_number = 0
36
+ @where_to_write = []
37
+ @state = :stopped
38
+ end
39
+
40
+ def start
41
+ @state = :started
42
+ end
43
+
44
+ def stop
45
+ @state = :stopped
46
+ end
47
+
48
+ def intercept_to(p1, p2 = nil)
49
+ if p2
50
+ service = p1
51
+ file = p2
52
+ else
53
+ service = nil
54
+ file = p1
55
+ end
56
+
57
+ @where_to_write << [service, file] # for req
58
+ @where_to_write << [service, file] # for res
59
+ end
60
+
61
+ def call(service_url, type, xml)
62
+ return if @state == :stopped
63
+
64
+ match_data = service_url.match(/https:\/\/adwords-sandbox.google.com\/api\/adwords\/([^\/]*)\/v201008\/([^\/]*)$/)
65
+ unless match_data
66
+ puts "*********** DumpInterceptor cannot recognize service"
67
+ puts "*********** #{service_url}"
68
+ end
69
+
70
+ soap_service = match_data[2]
71
+ soap_service = soap_service.gsub("Service", "").underscore
72
+
73
+ if @where_to_write.length <= @request_number
74
+ puts "************ DumpInterceptor I cannot know where to write soap messages!!!!"
75
+ @request_number += 1
76
+ return
77
+ end
78
+
79
+ service, file = *@where_to_write[@request_number]
80
+ if !service.nil? and service != soap_service
81
+ puts "************ DumpInterceptor service #{soap_service} instead of #{service}!!!!"
82
+ @request_number += 1
83
+ return
84
+ end
85
+ file += "-#{type}.xml"
86
+ write_xml(soap_service, file, xml)
87
+ @request_number += 1
88
+ end
89
+
90
+ end