sem4r 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # -------------------------------------------------------------------------
3
3
  # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
4
- #
4
+ #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining
6
6
  # a copy of this software and associated documentation files (the
7
7
  # "Software"), to deal in the Software without restriction, including
@@ -9,10 +9,10 @@
9
9
  # distribute, sublicense, and/or sell copies of the Software, and to
10
10
  # permit persons to whom the Software is furnished to do so, subject to
11
11
  # the following conditions:
12
- #
12
+ #
13
13
  # The above copyright notice and this permission notice shall be
14
14
  # included in all copies or substantial portions of the Software.
15
- #
15
+ #
16
16
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
17
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
18
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -20,16 +20,19 @@
20
20
  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
- #
24
23
  # -------------------------------------------------------------------------
25
24
 
26
- module Sem4r
27
-
28
- CliListCampaign = CliCommand.define_command("campaigns", "list campaigns") do |account|
29
- puts "listing campaings in #{account}"
30
- report( account.campaigns, :id, :name, :status )
31
- account.adwords.p_counters
32
- true
25
+ require File.expand_path(File.dirname(__FILE__) + '/../../rspec_helper')
26
+
27
+ describe BulkMutateJobSelector do
28
+ include Sem4rSpecHelper
29
+
30
+ it "should produce xml" do
31
+ selector = BulkMutateJobSelector.new do
32
+ status BulkMutateJobSelector::COMPLETED
33
+ status BulkMutateJobSelector::PROCESSING
34
+ end
35
+ puts selector.to_xml
33
36
  end
34
37
 
35
38
  end
@@ -20,7 +20,6 @@
20
20
  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
- #
24
23
  # -------------------------------------------------------------------------
25
24
 
26
25
  require File.expand_path(File.dirname(__FILE__) + '/../../rspec_helper')
@@ -32,7 +31,7 @@ describe BulkMutateJobService do
32
31
  @credentials = stub_credentials
33
32
  end
34
33
 
35
- it "should define 'all'" do
34
+ it "should define 'get'" do
36
35
  response_xml = read_xml("bulk_mutate_job", "get-res.xml")
37
36
  connector = mock("connector")
38
37
  connector.should_receive(:send).and_return(response_xml)
@@ -41,7 +40,7 @@ describe BulkMutateJobService do
41
40
  operation = mock("operation")
42
41
  operation.stub(:to_xml).and_return("xml")
43
42
 
44
- soap_message = service.all( @credentials, operation )
43
+ soap_message = service.get(@credentials, operation )
45
44
  els = soap_message.response.xpath("//getResponse")
46
45
  els.should_not be_empty
47
46
  end
@@ -20,48 +20,54 @@
20
20
  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
- #
24
23
  # -------------------------------------------------------------------------
25
24
 
26
25
  require File.expand_path(File.dirname(__FILE__) + '/../../rspec_helper')
27
26
 
28
27
  describe BulkMutateJob do
29
- include Sem4rSpecHelper, AggregatesSpecHelper
28
+ include Sem4rSpecHelper
30
29
 
31
30
  before do
32
- @adgroup = mock("adgroup").as_null_object
31
+ @ad_group = mock("adgroup").as_null_object
33
32
  end
34
33
 
35
34
  it "should accept type accessor" do
36
- # @adgroup.should_receive(:id).and_return(10)
37
-
38
- text_ad = AdGroupTextAd.new(@adgroup)
39
- text_ad.headline = "headline"
40
- text_ad.description1 = "description1"
41
- text_ad.description2 = "description2"
35
+ text_ad = AdGroupTextAd.new(@ad_group) do
36
+ headline = "headline"
37
+ description1 = "description1"
38
+ description2 = "description2"
39
+ end
40
+ ad_operation = AdGroupAdOperation.add text_ad
42
41
 
43
- ad_operation = AdGroupAdOperation.new
44
- ad_operation.add text_ad
45
-
46
- job = BulkMutateJob.new
42
+ job = BulkMutateJob.new
47
43
  job.campaign_id = 100
48
44
  job.add_operation ad_operation
49
45
 
50
46
  job.should have(1).operations
47
+ job.num_parts.should == 1
48
+ job.num_parts = 2
49
+ job.num_parts.should == 2
51
50
  end
52
51
 
53
52
  it "should parse xml" do
54
- el = read_model("//rval", "bulk_mutate_job", "get-res.xml")
53
+ el = read_model("//rval", "bulk_mutate_job", "get-res.xml")
55
54
  job = BulkMutateJob.from_element(el)
56
55
  job.id.should == 56889
57
56
  job.status.should == "PENDING"
58
57
  end
59
58
 
60
- it "should have a representation in xml" do
61
- @adgroup.stub(:id).and_return(3060284754)
59
+ it "should build xml only with id (input for google)" do
60
+ job = BulkMutateJob.new
61
+ job.instance_eval { @id = 1234 }
62
+ puts job.to_xml.should == '<operand xsi:type="BulkMutateJob"><id>1234</id></operand>'
63
+ end
64
+
65
+ it "should build xml (input for google)" do
66
+ @ad_group.stub(:id).and_return(3060284754)
62
67
  @campaign = stub("campaign")
63
68
  @campaign.stub(:id).and_return(100)
64
- job = create_bulk_mutate_job(@campaign, @adgroup)
69
+
70
+ job = template_bulk_mutate_job(@campaign, @ad_group)
65
71
 
66
72
  expected = read_model("//operand", "bulk_mutate_job", "mutate-req.xml")
67
73
  job.to_xml('operand').should xml_equivalent(expected)
@@ -0,0 +1,35 @@
1
+ <!-- Post to 'https://adwords-sandbox.google.com/api/adwords/job/v201008/BulkMutateJobService' -->
2
+
3
+ <env:Envelope xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:env='http://schemas.xmlsoap.org/soap/envelope/' xmlns='https://adwords.google.com/api/adwords/cm/v201008' xmlns:s='https://adwords.google.com/api/adwords/cm/v201008'>
4
+ <env:Header>
5
+ <s:RequestHeader env:mustUnderstand='0'>
6
+ <authToken>
7
+ ***censured***
8
+ </authToken>
9
+ <userAgent>
10
+ Sem4r Adwords Ruby Client Library (http://github.com/sem4r/sem4r)
11
+ </userAgent>
12
+ <developerToken>
13
+ ***censured***
14
+ </developerToken>
15
+ </s:RequestHeader>
16
+ </env:Header>
17
+ <env:Body>
18
+ <get xmlns='https://adwords.google.com/api/adwords/cm/v201008'>
19
+ <selector>
20
+ <jobStatuses>
21
+ COMPLETED
22
+ </jobStatuses>
23
+ <jobStatuses>
24
+ PROCESSING
25
+ </jobStatuses>
26
+ <jobStatuses>
27
+ FAILED
28
+ </jobStatuses>
29
+ <jobStatuses>
30
+ PENDING
31
+ </jobStatuses>
32
+ </selector>
33
+ </get>
34
+ </env:Body>
35
+ </env:Envelope>
@@ -0,0 +1,417 @@
1
+ <soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
2
+ <soap:Header>
3
+ <ResponseHeader xmlns='https://adwords.google.com/api/adwords/cm/v201008'>
4
+ <requestId>
5
+ 8faa099843707c0516849fa58eefdee0
6
+ </requestId>
7
+ <operations>
8
+ 15
9
+ </operations>
10
+ <responseTime>
11
+ 707
12
+ </responseTime>
13
+ <units>
14
+ 15
15
+ </units>
16
+ </ResponseHeader>
17
+ </soap:Header>
18
+ <soap:Body>
19
+ <getResponse xmlns='https://adwords.google.com/api/adwords/cm/v201008'>
20
+ <rval>
21
+ <context>
22
+ <authenticatedUserEmail>
23
+ sem4ruby@gmail.com
24
+ </authenticatedUserEmail>
25
+ <effectiveCustomerId>
26
+ 0
27
+ </effectiveCustomerId>
28
+ </context>
29
+ <Job.Type>
30
+ BulkMutateJob
31
+ </Job.Type>
32
+ <id>
33
+ 39169
34
+ </id>
35
+ <policy/>
36
+ <status>
37
+ PENDING
38
+ </status>
39
+ <numRequestParts>
40
+ 2
41
+ </numRequestParts>
42
+ <numRequestPartsReceived>
43
+ 1
44
+ </numRequestPartsReceived>
45
+ </rval>
46
+ <rval>
47
+ <context>
48
+ <authenticatedUserEmail>
49
+ sem4ruby@gmail.com
50
+ </authenticatedUserEmail>
51
+ <effectiveCustomerId>
52
+ 0
53
+ </effectiveCustomerId>
54
+ </context>
55
+ <Job.Type>
56
+ BulkMutateJob
57
+ </Job.Type>
58
+ <id>
59
+ 33669
60
+ </id>
61
+ <policy/>
62
+ <status>
63
+ COMPLETED
64
+ </status>
65
+ <numRequestParts>
66
+ 1
67
+ </numRequestParts>
68
+ <numRequestPartsReceived>
69
+ 1
70
+ </numRequestPartsReceived>
71
+ </rval>
72
+ <rval>
73
+ <context>
74
+ <authenticatedUserEmail>
75
+ sem4ruby@gmail.com
76
+ </authenticatedUserEmail>
77
+ <effectiveCustomerId>
78
+ 0
79
+ </effectiveCustomerId>
80
+ </context>
81
+ <Job.Type>
82
+ BulkMutateJob
83
+ </Job.Type>
84
+ <id>
85
+ 33693
86
+ </id>
87
+ <policy/>
88
+ <status>
89
+ COMPLETED
90
+ </status>
91
+ <numRequestParts>
92
+ 1
93
+ </numRequestParts>
94
+ <numRequestPartsReceived>
95
+ 1
96
+ </numRequestPartsReceived>
97
+ </rval>
98
+ <rval>
99
+ <context>
100
+ <authenticatedUserEmail>
101
+ sem4ruby@gmail.com
102
+ </authenticatedUserEmail>
103
+ <effectiveCustomerId>
104
+ 0
105
+ </effectiveCustomerId>
106
+ </context>
107
+ <Job.Type>
108
+ BulkMutateJob
109
+ </Job.Type>
110
+ <id>
111
+ 35859
112
+ </id>
113
+ <policy/>
114
+ <status>
115
+ COMPLETED
116
+ </status>
117
+ <numRequestParts>
118
+ 1
119
+ </numRequestParts>
120
+ <numRequestPartsReceived>
121
+ 1
122
+ </numRequestPartsReceived>
123
+ </rval>
124
+ <rval>
125
+ <context>
126
+ <authenticatedUserEmail>
127
+ sem4ruby@gmail.com
128
+ </authenticatedUserEmail>
129
+ <effectiveCustomerId>
130
+ 0
131
+ </effectiveCustomerId>
132
+ </context>
133
+ <Job.Type>
134
+ BulkMutateJob
135
+ </Job.Type>
136
+ <id>
137
+ 35967
138
+ </id>
139
+ <policy/>
140
+ <status>
141
+ COMPLETED
142
+ </status>
143
+ <numRequestParts>
144
+ 1
145
+ </numRequestParts>
146
+ <numRequestPartsReceived>
147
+ 1
148
+ </numRequestPartsReceived>
149
+ </rval>
150
+ <rval>
151
+ <context>
152
+ <authenticatedUserEmail>
153
+ sem4ruby@gmail.com
154
+ </authenticatedUserEmail>
155
+ <effectiveCustomerId>
156
+ 0
157
+ </effectiveCustomerId>
158
+ </context>
159
+ <Job.Type>
160
+ BulkMutateJob
161
+ </Job.Type>
162
+ <id>
163
+ 38429
164
+ </id>
165
+ <policy/>
166
+ <status>
167
+ COMPLETED
168
+ </status>
169
+ <numRequestParts>
170
+ 1
171
+ </numRequestParts>
172
+ <numRequestPartsReceived>
173
+ 1
174
+ </numRequestPartsReceived>
175
+ </rval>
176
+ <rval>
177
+ <context>
178
+ <authenticatedUserEmail>
179
+ sem4ruby@gmail.com
180
+ </authenticatedUserEmail>
181
+ <effectiveCustomerId>
182
+ 0
183
+ </effectiveCustomerId>
184
+ </context>
185
+ <Job.Type>
186
+ BulkMutateJob
187
+ </Job.Type>
188
+ <id>
189
+ 38444
190
+ </id>
191
+ <policy/>
192
+ <status>
193
+ COMPLETED
194
+ </status>
195
+ <numRequestParts>
196
+ 1
197
+ </numRequestParts>
198
+ <numRequestPartsReceived>
199
+ 1
200
+ </numRequestPartsReceived>
201
+ </rval>
202
+ <rval>
203
+ <context>
204
+ <authenticatedUserEmail>
205
+ sem4ruby@gmail.com
206
+ </authenticatedUserEmail>
207
+ <effectiveCustomerId>
208
+ 0
209
+ </effectiveCustomerId>
210
+ </context>
211
+ <Job.Type>
212
+ BulkMutateJob
213
+ </Job.Type>
214
+ <id>
215
+ 38486
216
+ </id>
217
+ <policy/>
218
+ <status>
219
+ COMPLETED
220
+ </status>
221
+ <numRequestParts>
222
+ 1
223
+ </numRequestParts>
224
+ <numRequestPartsReceived>
225
+ 1
226
+ </numRequestPartsReceived>
227
+ </rval>
228
+ <rval>
229
+ <context>
230
+ <authenticatedUserEmail>
231
+ sem4ruby@gmail.com
232
+ </authenticatedUserEmail>
233
+ <effectiveCustomerId>
234
+ 0
235
+ </effectiveCustomerId>
236
+ </context>
237
+ <Job.Type>
238
+ BulkMutateJob
239
+ </Job.Type>
240
+ <id>
241
+ 38612
242
+ </id>
243
+ <policy/>
244
+ <status>
245
+ COMPLETED
246
+ </status>
247
+ <numRequestParts>
248
+ 1
249
+ </numRequestParts>
250
+ <numRequestPartsReceived>
251
+ 1
252
+ </numRequestPartsReceived>
253
+ </rval>
254
+ <rval>
255
+ <context>
256
+ <authenticatedUserEmail>
257
+ sem4ruby@gmail.com
258
+ </authenticatedUserEmail>
259
+ <effectiveCustomerId>
260
+ 0
261
+ </effectiveCustomerId>
262
+ </context>
263
+ <Job.Type>
264
+ BulkMutateJob
265
+ </Job.Type>
266
+ <id>
267
+ 38642
268
+ </id>
269
+ <policy/>
270
+ <status>
271
+ COMPLETED
272
+ </status>
273
+ <numRequestParts>
274
+ 1
275
+ </numRequestParts>
276
+ <numRequestPartsReceived>
277
+ 1
278
+ </numRequestPartsReceived>
279
+ </rval>
280
+ <rval>
281
+ <context>
282
+ <authenticatedUserEmail>
283
+ sem4ruby@gmail.com
284
+ </authenticatedUserEmail>
285
+ <effectiveCustomerId>
286
+ 0
287
+ </effectiveCustomerId>
288
+ </context>
289
+ <Job.Type>
290
+ BulkMutateJob
291
+ </Job.Type>
292
+ <id>
293
+ 38648
294
+ </id>
295
+ <policy/>
296
+ <status>
297
+ COMPLETED
298
+ </status>
299
+ <numRequestParts>
300
+ 1
301
+ </numRequestParts>
302
+ <numRequestPartsReceived>
303
+ 1
304
+ </numRequestPartsReceived>
305
+ </rval>
306
+ <rval>
307
+ <context>
308
+ <authenticatedUserEmail>
309
+ sem4ruby@gmail.com
310
+ </authenticatedUserEmail>
311
+ <effectiveCustomerId>
312
+ 0
313
+ </effectiveCustomerId>
314
+ </context>
315
+ <Job.Type>
316
+ BulkMutateJob
317
+ </Job.Type>
318
+ <id>
319
+ 38654
320
+ </id>
321
+ <policy/>
322
+ <status>
323
+ COMPLETED
324
+ </status>
325
+ <numRequestParts>
326
+ 1
327
+ </numRequestParts>
328
+ <numRequestPartsReceived>
329
+ 1
330
+ </numRequestPartsReceived>
331
+ </rval>
332
+ <rval>
333
+ <context>
334
+ <authenticatedUserEmail>
335
+ sem4ruby@gmail.com
336
+ </authenticatedUserEmail>
337
+ <effectiveCustomerId>
338
+ 0
339
+ </effectiveCustomerId>
340
+ </context>
341
+ <Job.Type>
342
+ BulkMutateJob
343
+ </Job.Type>
344
+ <id>
345
+ 39081
346
+ </id>
347
+ <policy/>
348
+ <status>
349
+ COMPLETED
350
+ </status>
351
+ <numRequestParts>
352
+ 1
353
+ </numRequestParts>
354
+ <numRequestPartsReceived>
355
+ 1
356
+ </numRequestPartsReceived>
357
+ </rval>
358
+ <rval>
359
+ <context>
360
+ <authenticatedUserEmail>
361
+ sem4ruby@gmail.com
362
+ </authenticatedUserEmail>
363
+ <effectiveCustomerId>
364
+ 0
365
+ </effectiveCustomerId>
366
+ </context>
367
+ <Job.Type>
368
+ BulkMutateJob
369
+ </Job.Type>
370
+ <id>
371
+ 39147
372
+ </id>
373
+ <policy/>
374
+ <status>
375
+ COMPLETED
376
+ </status>
377
+ <numRequestParts>
378
+ 1
379
+ </numRequestParts>
380
+ <numRequestPartsReceived>
381
+ 1
382
+ </numRequestPartsReceived>
383
+ </rval>
384
+ <rval>
385
+ <context>
386
+ <authenticatedUserEmail>
387
+ sem4ruby@gmail.com
388
+ </authenticatedUserEmail>
389
+ <effectiveCustomerId>
390
+ 0
391
+ </effectiveCustomerId>
392
+ </context>
393
+ <failureReason>
394
+ <JobErrorReason>
395
+ USER_CANCELED_JOB
396
+ </JobErrorReason>
397
+ </failureReason>
398
+ <Job.Type>
399
+ BulkMutateJob
400
+ </Job.Type>
401
+ <id>
402
+ 38666
403
+ </id>
404
+ <policy/>
405
+ <status>
406
+ FAILED
407
+ </status>
408
+ <numRequestParts>
409
+ 2
410
+ </numRequestParts>
411
+ <numRequestPartsReceived>
412
+ 1
413
+ </numRequestPartsReceived>
414
+ </rval>
415
+ </getResponse>
416
+ </soap:Body>
417
+ </soap:Envelope>