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
@@ -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>