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
@@ -0,0 +1,66 @@
1
+ #
2
+ # jeweler
3
+ #
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+
8
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
9
+ gem.name = "sem4r"
10
+ gem.summary = %Q{Library to access google adwords api. Works with ruby 1.9 and ruby 1.8}
11
+ gem.description = %Q{
12
+ Sem4r is a library to access google adwords api.
13
+ It will works with ruby 1.9 and ruby 1.8 without soap4r.
14
+ It uses a high level model instead of a low level api.
15
+ You think about clients, campaigns, keywords and not about operations, operands, selectors, service calls.
16
+
17
+ This is a ALPHA version don't use in production.
18
+ If you are interested in this project let me now: install it and update periodically, so the gemcutter
19
+ download counter go up. Or subscribe to my feed at sem4r.com. Or watch the project on github.
20
+ Or simply drop me a line in email. However I will know there is someone out of here.
21
+ }
22
+
23
+ gem.authors = ["Sem4r"]
24
+ gem.email = "sem4ruby@gmail.com"
25
+ gem.homepage = "http://www.sem4r.com"
26
+
27
+ #
28
+ # dependecies
29
+ #
30
+ # gem.add_dependency 'patron'
31
+ gem.add_dependency 'builder'
32
+ gem.add_dependency 'nokogiri'
33
+ gem.add_development_dependency 'rspec'
34
+ gem.add_development_dependency 'differ'
35
+
36
+ #
37
+ # files
38
+ #
39
+ gem.files = %w{LICENSE README.rdoc Rakefile VERSION.yml sem4r.gemspec Gemfile Gemfile.lock}
40
+ gem.files << 'config/sem4r.example.yml'
41
+ gem.files.concat Dir['examples_sem4r/*.rb']
42
+ gem.files.concat Dir['examples_blog/*.rb']
43
+ gem.files.concat Dir['tasks/**/*.rake']
44
+ gem.files.concat Dir['lib/**/*.rb']
45
+
46
+ #
47
+ # test files
48
+ #
49
+ gem.test_files = Dir['spec/**/*.rb']
50
+ gem.test_files.concat Dir['spec/**/*.xml']
51
+ gem.test_files.concat Dir['spec/fixtures/**/*']
52
+
53
+ #
54
+ # rubyforge
55
+ #
56
+ # gem.rubyforge_project = 'sem'
57
+ end
58
+
59
+ # Jeweler::RubyforgeTasks.new do |rubyforge|
60
+ # rubyforge.doc_task = "rdoc"
61
+ # end
62
+
63
+ Jeweler::GemcutterTasks.new
64
+ rescue LoadError
65
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
66
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ #
2
+ # spec
3
+ #
4
+ begin
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.rspec_opts = ["--color", "--format", "spec", '--backtrace']
10
+ t.pattern = 'spec/**/*_spec.rb'
11
+ end
12
+
13
+ #desc "Generate HTML report for failing examples"
14
+ #RSpec::Core::RakeTask.new('failing_examples_with_html') do |spec|
15
+ # spec.pattern = 'failing_examples/**/*.rb'
16
+ # spec.rspec_opts = ["--format", "html:doc/reports/tools/failing_examples.html", "--diff"]
17
+ # spec.fail_on_error = false
18
+ #end
19
+ rescue LoadError
20
+ puts "rspec (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
data/tasks/sem4r.rake ADDED
@@ -0,0 +1,25 @@
1
+ ###############################################################################
2
+ # Sem4r
3
+
4
+ namespace :sem4r do
5
+ #
6
+ # examples
7
+ #
8
+ desc 'run all sem4r example'
9
+ task :examples do
10
+
11
+ Dir['examples_sem4r/*.rb'].sort.each do |filename|
12
+ next unless filename =~ /\d\d.+\.rb$/
13
+ unless system "ruby #{filename}"
14
+ exit
15
+ end
16
+ end
17
+ puts "All examples run successfull"
18
+
19
+ end
20
+
21
+ desc "Start an IRB shell"
22
+ task :shell do
23
+ sh 'IRBRC=`pwd`/config/irbrc.rb irb'
24
+ end
25
+ end
data/tasks/yard.rake ADDED
@@ -0,0 +1,31 @@
1
+ begin
2
+ require 'yard'
3
+
4
+ YARD::Rake::YardocTask.new do |t|
5
+ t.files = ['lib/**/*.rb']
6
+ t.options = [
7
+ '--readme', 'README.rdoc',
8
+ # '--output-dir', 'doc/yardoc'
9
+ '--any',
10
+ '--extra',
11
+ '--opts'
12
+ ]
13
+ end
14
+
15
+
16
+ #
17
+ # rdoc
18
+ #
19
+
20
+ #require 'rake/rdoctask'
21
+ #
22
+ #Rake::RDocTask.new do |rdoc|
23
+ # version = File.exist?('VERSION') ? File.read('VERSION') : ""
24
+ # rdoc.rdoc_dir = 'rdoc'
25
+ # rdoc.title = "sem4r #{version}"
26
+ # rdoc.rdoc_files.include('README*')
27
+ # rdoc.rdoc_files.include('lib/**/*.rb')
28
+ #end
29
+ rescue LoadError
30
+ puts "Yard (or a dependency) not available. Install it with: sudo gem install jeweler"
31
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Sem4r
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-28 00:00:00 +01:00
17
+ date: 2010-12-11 00:00:00 +01:00
18
18
  default_executable: sem
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -31,7 +31,7 @@ dependencies:
31
31
  prerelease: false
32
32
  version_requirements: *id001
33
33
  - !ruby/object:Gem::Dependency
34
- name: jeweler
34
+ name: nokogiri
35
35
  requirement: &id002 !ruby/object:Gem::Requirement
36
36
  none: false
37
37
  requirements:
@@ -44,7 +44,7 @@ dependencies:
44
44
  prerelease: false
45
45
  version_requirements: *id002
46
46
  - !ruby/object:Gem::Dependency
47
- name: rake
47
+ name: httpclient
48
48
  requirement: &id003 !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -57,7 +57,7 @@ dependencies:
57
57
  prerelease: false
58
58
  version_requirements: *id003
59
59
  - !ruby/object:Gem::Dependency
60
- name: nokogiri
60
+ name: highline
61
61
  requirement: &id004 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
@@ -70,7 +70,7 @@ dependencies:
70
70
  prerelease: false
71
71
  version_requirements: *id004
72
72
  - !ruby/object:Gem::Dependency
73
- name: builder
73
+ name: jeweler
74
74
  requirement: &id005 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
@@ -79,11 +79,11 @@ dependencies:
79
79
  segments:
80
80
  - 0
81
81
  version: "0"
82
- type: :runtime
82
+ type: :development
83
83
  prerelease: false
84
84
  version_requirements: *id005
85
85
  - !ruby/object:Gem::Dependency
86
- name: nokogiri
86
+ name: rake
87
87
  requirement: &id006 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
@@ -92,11 +92,11 @@ dependencies:
92
92
  segments:
93
93
  - 0
94
94
  version: "0"
95
- type: :runtime
95
+ type: :development
96
96
  prerelease: false
97
97
  version_requirements: *id006
98
98
  - !ruby/object:Gem::Dependency
99
- name: rspec
99
+ name: yard
100
100
  requirement: &id007 !ruby/object:Gem::Requirement
101
101
  none: false
102
102
  requirements:
@@ -109,7 +109,7 @@ dependencies:
109
109
  prerelease: false
110
110
  version_requirements: *id007
111
111
  - !ruby/object:Gem::Dependency
112
- name: differ
112
+ name: bundler
113
113
  requirement: &id008 !ruby/object:Gem::Requirement
114
114
  none: false
115
115
  requirements:
@@ -121,6 +121,58 @@ dependencies:
121
121
  type: :development
122
122
  prerelease: false
123
123
  version_requirements: *id008
124
+ - !ruby/object:Gem::Dependency
125
+ name: builder
126
+ requirement: &id009 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ segments:
132
+ - 0
133
+ version: "0"
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: *id009
137
+ - !ruby/object:Gem::Dependency
138
+ name: nokogiri
139
+ requirement: &id010 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ segments:
145
+ - 0
146
+ version: "0"
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: *id010
150
+ - !ruby/object:Gem::Dependency
151
+ name: rspec
152
+ requirement: &id011 !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ segments:
158
+ - 0
159
+ version: "0"
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: *id011
163
+ - !ruby/object:Gem::Dependency
164
+ name: differ
165
+ requirement: &id012 !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ segments:
171
+ - 0
172
+ version: "0"
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: *id012
124
176
  description: "\n Sem4r is a library to access google adwords api.\n It will works with ruby 1.9 and ruby 1.8 without soap4r.\n It uses a high level model instead of a low level api.\n You think about clients, campaigns, keywords and not about operations, operands, selectors, service calls.\n\n This is a ALPHA version don't use in production.\n If you are interested in this project let me now: install it and update periodically, so the gemcutter\n download counter go up. Or subscribe to my feed at sem4r.com. Or watch the project on github.\n Or simply drop me a line in email. However I will know there is someone out of here.\n "
125
177
  email: sem4ruby@gmail.com
126
178
  executables:
@@ -147,21 +199,20 @@ files:
147
199
  - examples_sem4r/03_list_ad.rb
148
200
  - examples_sem4r/04_list_keywords.rb
149
201
  - examples_sem4r/05_request_report.rb
150
- - examples_sem4r/05_request_report_2010.rb
151
- - examples_sem4r/06_create_campaigns.rb
152
- - examples_sem4r/07_create_campaigns_block.rb
153
- - examples_sem4r/07_create_campaigns_simple.rb
154
- - examples_sem4r/08_ad_params.rb
155
- - examples_sem4r/09_targeting_idea.rb
156
- - examples_sem4r/10_get_location.rb
157
- - examples_sem4r/11_submit_bulk_job.rb
158
- - examples_sem4r/12_list_bulk_job.rb
202
+ - examples_sem4r/06_request_report_definition.rb
203
+ - examples_sem4r/07_create_campaigns.rb
204
+ - examples_sem4r/08_create_campaigns_block.rb
205
+ - examples_sem4r/09_create_campaigns_simple.rb
206
+ - examples_sem4r/10_ad_params.rb
207
+ - examples_sem4r/11_targeting_idea.rb
208
+ - examples_sem4r/12_get_location.rb
209
+ - examples_sem4r/13_submit_bulk_job.rb
210
+ - examples_sem4r/14_list_bulk_job.rb
159
211
  - examples_sem4r/30_prune_empty_adgroup.rb
160
212
  - examples_sem4r/31_empty_accounts.rb
161
213
  - examples_sem4r/example_helper.rb
162
214
  - lib/sem4r.rb
163
215
  - lib/sem4r/account.rb
164
- - lib/sem4r/ad_extension_override/ad_extension_override_service.rb
165
216
  - lib/sem4r/ad_group/ad_group.rb
166
217
  - lib/sem4r/ad_group/ad_group_bids.rb
167
218
  - lib/sem4r/ad_group/ad_group_service.rb
@@ -182,7 +233,6 @@ files:
182
233
  - lib/sem4r/ad_param/ad_param_operation.rb
183
234
  - lib/sem4r/ad_param/ad_param_service.rb
184
235
  - lib/sem4r/adwords.rb
185
- - lib/sem4r/api_counters.rb
186
236
  - lib/sem4r/base.rb
187
237
  - lib/sem4r/bulk_mutate_job/bulk_mutate_job.rb
188
238
  - lib/sem4r/bulk_mutate_job/bulk_mutate_job_account_extension.rb
@@ -192,26 +242,11 @@ files:
192
242
  - lib/sem4r/campaign/campaign.rb
193
243
  - lib/sem4r/campaign/campaign_account_extension.rb
194
244
  - lib/sem4r/campaign/campaign_service.rb
195
- - lib/sem4r/campaign_criterion/campaign_criterion_service.rb
196
- - lib/sem4r/campaign_target/campaign_target_service.rb
197
- - lib/sem4r/cli/cli_command.rb
198
- - lib/sem4r/cli/cli_common_args.rb
199
- - lib/sem4r/cli/cli_helpers.rb
200
- - lib/sem4r/cli/cli_sem.rb
201
- - lib/sem4r/cli/commands/cli_download_report.rb
202
- - lib/sem4r/cli/commands/cli_ideas.rb
203
- - lib/sem4r/cli/commands/cli_info.rb
204
- - lib/sem4r/cli/commands/cli_list_ads.rb
205
- - lib/sem4r/cli/commands/cli_list_campaign.rb
206
- - lib/sem4r/cli/commands/cli_list_client.rb
207
- - lib/sem4r/cli/commands/cli_list_keywords.rb
208
- - lib/sem4r/cli/commands/cli_list_report.rb
209
- - lib/sem4r/cli/commands/cli_repdef.rb
210
- - lib/sem4r/cli/commands/cli_report.rb
211
- - lib/sem4r/cli/commands/cli_request_report.rb
212
245
  - lib/sem4r/credentials.rb
213
246
  - lib/sem4r/extensions.rb
247
+ - lib/sem4r/geo_location/address.rb
214
248
  - lib/sem4r/geo_location/geo_location_account_extension.rb
249
+ - lib/sem4r/geo_location/geo_location_selector.rb
215
250
  - lib/sem4r/geo_location/geo_location_service.rb
216
251
  - lib/sem4r/info/info_account_extension.rb
217
252
  - lib/sem4r/info/info_selector.rb
@@ -224,14 +259,8 @@ files:
224
259
  - lib/sem4r/report_definition/report_definition_service.rb
225
260
  - lib/sem4r/report_definition/report_field.rb
226
261
  - lib/sem4r/sem4r_error.rb
227
- - lib/sem4r/services/http_connector.rb
228
- - lib/sem4r/services/service.rb
229
- - lib/sem4r/services/soap_call.rb
230
- - lib/sem4r/services/soap_connector.rb
231
- - lib/sem4r/services/soap_dumper.rb
232
- - lib/sem4r/services/soap_error.rb
233
- - lib/sem4r/services/soap_message_v13.rb
234
- - lib/sem4r/services/soap_message_v2010.rb
262
+ - lib/sem4r/sem4r_templates.rb
263
+ - lib/sem4r/service.rb
235
264
  - lib/sem4r/targeting_idea/targeting_idea.rb
236
265
  - lib/sem4r/targeting_idea/targeting_idea_account_extension.rb
237
266
  - lib/sem4r/targeting_idea/targeting_idea_selector.rb
@@ -243,18 +272,49 @@ files:
243
272
  - lib/sem4r/v13_report/report_account_extension.rb
244
273
  - lib/sem4r/v13_report/report_job.rb
245
274
  - lib/sem4r/v13_report/report_service.rb
246
- - lib/sem4r/v13_traffic_estimator/traffic_estimator_service.rb
247
275
  - lib/sem4r_cli.rb
248
- - lib/soap_helpers/soap_attributes.rb
276
+ - lib/sem4r_cli/cli_helpers.rb
277
+ - lib/sem4r_cli/cli_mini_framework.rb
278
+ - lib/sem4r_cli/cli_sem.rb
279
+ - lib/sem4r_cli/commands/cli_ads.rb
280
+ - lib/sem4r_cli/commands/cli_campaign.rb
281
+ - lib/sem4r_cli/commands/cli_clients.rb
282
+ - lib/sem4r_cli/commands/cli_ideas.rb
283
+ - lib/sem4r_cli/commands/cli_info.rb
284
+ - lib/sem4r_cli/commands/cli_job.rb
285
+ - lib/sem4r_cli/commands/cli_keywords.rb
286
+ - lib/sem4r_cli/commands/cli_profile.rb
287
+ - lib/sem4r_cli/commands/cli_repdef.rb
288
+ - lib/sem4r_cli/commands/cli_report.rb
289
+ - lib/sem4r_soap.rb
290
+ - lib/sem4r_soap/http_connector.rb
291
+ - lib/sem4r_soap/soap_attributes.rb
292
+ - lib/sem4r_soap/soap_dumper.rb
293
+ - lib/sem4r_soap/soap_error.rb
294
+ - lib/sem4r_soap/soap_response.rb
295
+ - lib/sem4r_soap/soap_service.rb
296
+ - lib/sem4r_soap/soap_service_v13.rb
297
+ - lib/sem4r_soap/soap_service_v2010.rb
249
298
  - sem4r.gemspec
250
- - spec/aggregates_rspec_helper.rb
299
+ - tasks/jeweler.rake
300
+ - tasks/rspec.rake
301
+ - tasks/sem4r.rake
302
+ - tasks/yard.rake
251
303
  - spec/build_fixtures.rb
304
+ - spec/fixtures/password.example.yml
252
305
  - spec/fixtures/sem4r.example.yml
253
- - spec/fixtures/services/error.xml
254
- - spec/rspec_hash.rb
306
+ - spec/fixtures/soap_error.xml
307
+ - spec/fixtures/soap_error2.xml
308
+ - spec/helpers/dump_interceptor.rb
309
+ - spec/helpers/fixtures_bulk_mutate_job.rb
310
+ - spec/helpers/fixtures_geo_location.rb
311
+ - spec/helpers/fixtures_info.rb
312
+ - spec/helpers/fixtures_report_definition.rb
313
+ - spec/helpers/rspec_hash.rb
314
+ - spec/helpers/rspec_matchers.rb
315
+ - spec/helpers/rspec_sem4r_helper.rb
316
+ - spec/helpers/sem4r_stubs.rb
255
317
  - spec/rspec_helper.rb
256
- - spec/rspec_matchers.rb
257
- - spec/rspec_sem4r_helper.rb
258
318
  - spec/sem4r/account_spec.rb
259
319
  - spec/sem4r/ad_group/ad_group_bids_spec.rb
260
320
  - spec/sem4r/ad_group/ad_group_service_spec.rb
@@ -295,10 +355,15 @@ files:
295
355
  - spec/sem4r/ad_param/fixtures/mutate_set-req.xml
296
356
  - spec/sem4r/ad_param/fixtures/mutate_set-res.xml
297
357
  - spec/sem4r/adwords_spec.rb
358
+ - spec/sem4r/bulk_mutate_job/bulk_mutate_job_selector_spec.rb
298
359
  - spec/sem4r/bulk_mutate_job/bulk_mutate_job_service_spec.rb
299
360
  - spec/sem4r/bulk_mutate_job/bulk_mutate_job_spec.rb
361
+ - spec/sem4r/bulk_mutate_job/fixtures/get-list_job-req.xml
362
+ - spec/sem4r/bulk_mutate_job/fixtures/get-list_job-res.xml
300
363
  - spec/sem4r/bulk_mutate_job/fixtures/get-req.xml
301
364
  - spec/sem4r/bulk_mutate_job/fixtures/get-res.xml
365
+ - spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-req.xml
366
+ - spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-res.xml
302
367
  - spec/sem4r/bulk_mutate_job/fixtures/mutate-req.xml
303
368
  - spec/sem4r/bulk_mutate_job/fixtures/mutate-res.xml
304
369
  - spec/sem4r/bulk_mutate_job/job_operation_spec.rb
@@ -308,20 +373,28 @@ files:
308
373
  - spec/sem4r/campaign/fixtures/get-res.xml
309
374
  - spec/sem4r/campaign/fixtures/mutate_add-req.xml
310
375
  - spec/sem4r/campaign/fixtures/mutate_add-res.xml
311
- - spec/sem4r/cli/cli_spec.rb
312
376
  - spec/sem4r/credentials_spec.rb
377
+ - spec/sem4r/geo_location/address_spec.rb
378
+ - spec/sem4r/geo_location/fixtures/get-req.xml
379
+ - spec/sem4r/geo_location/fixtures/get-res.xml
313
380
  - spec/sem4r/info/account_info_extension_spec.rb
381
+ - spec/sem4r/info/fixtures/get-req.xml
382
+ - spec/sem4r/info/fixtures/get-res.xml
314
383
  - spec/sem4r/info/fixtures/get_unit_count-req.xml
315
384
  - spec/sem4r/info/fixtures/get_unit_count-res.xml
316
385
  - spec/sem4r/nokogiri_parsing_spec.rb
317
- - spec/sem4r/report_definition/fixtures/mutate_add-req.xml
318
- - spec/sem4r/report_definition/fixtures/mutate_add-req_orig.xml
386
+ - spec/sem4r/operation_spec.rb
387
+ - spec/sem4r/report_definition/fixtures/get-list-repdef-req.xml
388
+ - spec/sem4r/report_definition/fixtures/get-list-repdef-res.xml
389
+ - spec/sem4r/report_definition/fixtures/getReportFields-req.xml
390
+ - spec/sem4r/report_definition/fixtures/getReportFields-res.xml
391
+ - spec/sem4r/report_definition/fixtures/mutate-add-report-req.xml
392
+ - spec/sem4r/report_definition/fixtures/mutate-add-report-res.xml
319
393
  - spec/sem4r/report_definition/report_definition_service_spec.rb
320
394
  - spec/sem4r/report_definition/report_definition_spec.rb
395
+ - spec/sem4r/report_definition/report_field_spec.rb
321
396
  - spec/sem4r/rexml_parsing_spec.rb
322
- - spec/sem4r/services/service_spec.rb
323
- - spec/sem4r/services/soap_call_spec.rb
324
- - spec/sem4r/services/soap_message_v13_spec.rb
397
+ - spec/sem4r/service_spec.rb
325
398
  - spec/sem4r/targeting_idea/fixtures/get-req-all-options.xml
326
399
  - spec/sem4r/targeting_idea/fixtures/get-req.xml
327
400
  - spec/sem4r/targeting_idea/fixtures/get-res.xml
@@ -341,8 +414,10 @@ files:
341
414
  - spec/sem4r/v13_report/fixtures/schedule_report_job-res.xml
342
415
  - spec/sem4r/v13_report/report_service_spec.rb
343
416
  - spec/sem4r/v13_report/report_spec.rb
344
- - spec/sem4r_stubs.rb
345
- - spec/soap_helpers/soap_attributes_spec.rb
417
+ - spec/sem4r_cli/cli_spec.rb
418
+ - spec/sem4r_soap/soap_attributes_spec.rb
419
+ - spec/sem4r_soap/soap_response_spec.rb
420
+ - spec/sem4r_soap/soap_service_spec.rb
346
421
  - bin/sem
347
422
  has_rdoc: true
348
423
  homepage: http://www.sem4r.com
@@ -377,14 +452,21 @@ signing_key:
377
452
  specification_version: 3
378
453
  summary: Library to access google adwords api. Works with ruby 1.9 and ruby 1.8
379
454
  test_files:
380
- - spec/aggregates_rspec_helper.rb
381
455
  - spec/build_fixtures.rb
456
+ - spec/fixtures/password.example.yml
382
457
  - spec/fixtures/sem4r.example.yml
383
- - spec/fixtures/services/error.xml
384
- - spec/rspec_hash.rb
458
+ - spec/fixtures/soap_error.xml
459
+ - spec/fixtures/soap_error2.xml
460
+ - spec/helpers/dump_interceptor.rb
461
+ - spec/helpers/fixtures_bulk_mutate_job.rb
462
+ - spec/helpers/fixtures_geo_location.rb
463
+ - spec/helpers/fixtures_info.rb
464
+ - spec/helpers/fixtures_report_definition.rb
465
+ - spec/helpers/rspec_hash.rb
466
+ - spec/helpers/rspec_matchers.rb
467
+ - spec/helpers/rspec_sem4r_helper.rb
468
+ - spec/helpers/sem4r_stubs.rb
385
469
  - spec/rspec_helper.rb
386
- - spec/rspec_matchers.rb
387
- - spec/rspec_sem4r_helper.rb
388
470
  - spec/sem4r/account_spec.rb
389
471
  - spec/sem4r/ad_group/ad_group_bids_spec.rb
390
472
  - spec/sem4r/ad_group/ad_group_service_spec.rb
@@ -425,10 +507,15 @@ test_files:
425
507
  - spec/sem4r/ad_param/fixtures/mutate_set-req.xml
426
508
  - spec/sem4r/ad_param/fixtures/mutate_set-res.xml
427
509
  - spec/sem4r/adwords_spec.rb
510
+ - spec/sem4r/bulk_mutate_job/bulk_mutate_job_selector_spec.rb
428
511
  - spec/sem4r/bulk_mutate_job/bulk_mutate_job_service_spec.rb
429
512
  - spec/sem4r/bulk_mutate_job/bulk_mutate_job_spec.rb
513
+ - spec/sem4r/bulk_mutate_job/fixtures/get-list_job-req.xml
514
+ - spec/sem4r/bulk_mutate_job/fixtures/get-list_job-res.xml
430
515
  - spec/sem4r/bulk_mutate_job/fixtures/get-req.xml
431
516
  - spec/sem4r/bulk_mutate_job/fixtures/get-res.xml
517
+ - spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-req.xml
518
+ - spec/sem4r/bulk_mutate_job/fixtures/mutate-add_job-res.xml
432
519
  - spec/sem4r/bulk_mutate_job/fixtures/mutate-req.xml
433
520
  - spec/sem4r/bulk_mutate_job/fixtures/mutate-res.xml
434
521
  - spec/sem4r/bulk_mutate_job/job_operation_spec.rb
@@ -438,20 +525,28 @@ test_files:
438
525
  - spec/sem4r/campaign/fixtures/get-res.xml
439
526
  - spec/sem4r/campaign/fixtures/mutate_add-req.xml
440
527
  - spec/sem4r/campaign/fixtures/mutate_add-res.xml
441
- - spec/sem4r/cli/cli_spec.rb
442
528
  - spec/sem4r/credentials_spec.rb
529
+ - spec/sem4r/geo_location/address_spec.rb
530
+ - spec/sem4r/geo_location/fixtures/get-req.xml
531
+ - spec/sem4r/geo_location/fixtures/get-res.xml
443
532
  - spec/sem4r/info/account_info_extension_spec.rb
533
+ - spec/sem4r/info/fixtures/get-req.xml
534
+ - spec/sem4r/info/fixtures/get-res.xml
444
535
  - spec/sem4r/info/fixtures/get_unit_count-req.xml
445
536
  - spec/sem4r/info/fixtures/get_unit_count-res.xml
446
537
  - spec/sem4r/nokogiri_parsing_spec.rb
447
- - spec/sem4r/report_definition/fixtures/mutate_add-req.xml
448
- - spec/sem4r/report_definition/fixtures/mutate_add-req_orig.xml
538
+ - spec/sem4r/operation_spec.rb
539
+ - spec/sem4r/report_definition/fixtures/get-list-repdef-req.xml
540
+ - spec/sem4r/report_definition/fixtures/get-list-repdef-res.xml
541
+ - spec/sem4r/report_definition/fixtures/getReportFields-req.xml
542
+ - spec/sem4r/report_definition/fixtures/getReportFields-res.xml
543
+ - spec/sem4r/report_definition/fixtures/mutate-add-report-req.xml
544
+ - spec/sem4r/report_definition/fixtures/mutate-add-report-res.xml
449
545
  - spec/sem4r/report_definition/report_definition_service_spec.rb
450
546
  - spec/sem4r/report_definition/report_definition_spec.rb
547
+ - spec/sem4r/report_definition/report_field_spec.rb
451
548
  - spec/sem4r/rexml_parsing_spec.rb
452
- - spec/sem4r/services/service_spec.rb
453
- - spec/sem4r/services/soap_call_spec.rb
454
- - spec/sem4r/services/soap_message_v13_spec.rb
549
+ - spec/sem4r/service_spec.rb
455
550
  - spec/sem4r/targeting_idea/fixtures/get-req-all-options.xml
456
551
  - spec/sem4r/targeting_idea/fixtures/get-req.xml
457
552
  - spec/sem4r/targeting_idea/fixtures/get-res.xml
@@ -471,5 +566,7 @@ test_files:
471
566
  - spec/sem4r/v13_report/fixtures/schedule_report_job-res.xml
472
567
  - spec/sem4r/v13_report/report_service_spec.rb
473
568
  - spec/sem4r/v13_report/report_spec.rb
474
- - spec/sem4r_stubs.rb
475
- - spec/soap_helpers/soap_attributes_spec.rb
569
+ - spec/sem4r_cli/cli_spec.rb
570
+ - spec/sem4r_soap/soap_attributes_spec.rb
571
+ - spec/sem4r_soap/soap_response_spec.rb
572
+ - spec/sem4r_soap/soap_service_spec.rb
@@ -1,30 +0,0 @@
1
- # -------------------------------------------------------------------
2
- # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- # -------------------------------------------------------------------
23
-
24
- module Sem4r
25
- class AdExtensionOverrideService
26
- def initialize
27
-
28
- end
29
- end
30
- end
@@ -1,8 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module Sem4r
3
- class ApiCounters
4
- def initialize
5
-
6
- end
7
- end
8
- end
@@ -1,30 +0,0 @@
1
- # -------------------------------------------------------------------
2
- # Copyright (c) 2009-2010 Sem4r sem4ruby@gmail.com
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- # -------------------------------------------------------------------
23
-
24
- module Sem4r
25
- class CampaignTargetService
26
- def initialize
27
-
28
- end
29
- end
30
- end