ysm4r 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/Authors.txt +2 -0
  2. data/ChangeLog.txt +1 -0
  3. data/License.txt +13 -0
  4. data/Rakefile +209 -0
  5. data/Readme.txt +4 -0
  6. data/clean.sh +3 -0
  7. data/lib/soapex/driver.rb +13 -0
  8. data/lib/soapex/error.rb +49 -0
  9. data/lib/soapex/mapping.rb +31 -0
  10. data/lib/soapex/wsdl2ruby.rb +166 -0
  11. data/lib/ysm4r.rb +4 -0
  12. data/lib/ysm4r/client.rb +120 -0
  13. data/lib/ysm4r/service.rb +68 -0
  14. data/lib/ysm4r/v1/AccountService.rb +370 -0
  15. data/lib/ysm4r/v1/AccountServiceDriver.rb +162 -0
  16. data/lib/ysm4r/v1/AccountServiceMappingRegistry.rb +509 -0
  17. data/lib/ysm4r/v1/AdGroupService.rb +649 -0
  18. data/lib/ysm4r/v1/AdGroupServiceDriver.rb +226 -0
  19. data/lib/ysm4r/v1/AdGroupServiceMappingRegistry.rb +864 -0
  20. data/lib/ysm4r/v1/AdService.rb +533 -0
  21. data/lib/ysm4r/v1/AdServiceDriver.rb +178 -0
  22. data/lib/ysm4r/v1/AdServiceMappingRegistry.rb +753 -0
  23. data/lib/ysm4r/v1/BasicReportService.rb +259 -0
  24. data/lib/ysm4r/v1/BasicReportServiceDriver.rb +98 -0
  25. data/lib/ysm4r/v1/BasicReportServiceMappingRegistry.rb +389 -0
  26. data/lib/ysm4r/v1/BidInformationService.rb +69 -0
  27. data/lib/ysm4r/v1/BidInformationServiceDriver.rb +50 -0
  28. data/lib/ysm4r/v1/BidInformationServiceMappingRegistry.rb +135 -0
  29. data/lib/ysm4r/v1/BudgetingService.rb +161 -0
  30. data/lib/ysm4r/v1/BudgetingServiceDriver.rb +98 -0
  31. data/lib/ysm4r/v1/BudgetingServiceMappingRegistry.rb +230 -0
  32. data/lib/ysm4r/v1/CampaignService.rb +644 -0
  33. data/lib/ysm4r/v1/CampaignServiceDriver.rb +210 -0
  34. data/lib/ysm4r/v1/CampaignServiceMappingRegistry.rb +909 -0
  35. data/lib/ysm4r/v1/ExcludedWordsService.rb +294 -0
  36. data/lib/ysm4r/v1/ExcludedWordsServiceDriver.rb +122 -0
  37. data/lib/ysm4r/v1/ExcludedWordsServiceMappingRegistry.rb +469 -0
  38. data/lib/ysm4r/v1/ForecastService.rb +200 -0
  39. data/lib/ysm4r/v1/ForecastServiceDriver.rb +66 -0
  40. data/lib/ysm4r/v1/ForecastServiceMappingRegistry.rb +359 -0
  41. data/lib/ysm4r/v1/KeywordResearchService.rb +290 -0
  42. data/lib/ysm4r/v1/KeywordResearchServiceDriver.rb +66 -0
  43. data/lib/ysm4r/v1/KeywordResearchServiceMappingRegistry.rb +548 -0
  44. data/lib/ysm4r/v1/KeywordService.rb +671 -0
  45. data/lib/ysm4r/v1/KeywordServiceDriver.rb +218 -0
  46. data/lib/ysm4r/v1/KeywordServiceMappingRegistry.rb +913 -0
  47. data/lib/ysm4r/v1/LocationService.rb +53 -0
  48. data/lib/ysm4r/v1/LocationServiceDriver.rb +50 -0
  49. data/lib/ysm4r/v1/LocationServiceMappingRegistry.rb +111 -0
  50. data/lib/ysm4r/v1/MasterAccountService.rb +289 -0
  51. data/lib/ysm4r/v1/MasterAccountServiceDriver.rb +74 -0
  52. data/lib/ysm4r/v1/MasterAccountServiceMappingRegistry.rb +414 -0
  53. data/lib/ysm4r/v1/UpgradeService.rb +72 -0
  54. data/lib/ysm4r/v1/UpgradeServiceDriver.rb +58 -0
  55. data/lib/ysm4r/v1/UpgradeServiceMappingRegistry.rb +145 -0
  56. data/lib/ysm4r/v1/UserManagementService.rb +766 -0
  57. data/lib/ysm4r/v1/UserManagementServiceDriver.rb +290 -0
  58. data/lib/ysm4r/v1/UserManagementServiceMappingRegistry.rb +1057 -0
  59. data/lib/ysm4r/v1/sandbox/LocationService.rb +53 -0
  60. data/lib/ysm4r/v1/sandbox/LocationServiceDriver.rb +50 -0
  61. data/lib/ysm4r/v1/sandbox/LocationServiceMappingRegistry.rb +111 -0
  62. data/lib/ysm4r/v1/sandbox/UpgradeService.rb +72 -0
  63. data/lib/ysm4r/v1/sandbox/UpgradeServiceDriver.rb +58 -0
  64. data/lib/ysm4r/v1/sandbox/UpgradeServiceMappingRegistry.rb +145 -0
  65. data/lib/ysm4r/v2/AccountService.rb +372 -0
  66. data/lib/ysm4r/v2/AccountServiceDriver.rb +162 -0
  67. data/lib/ysm4r/v2/AccountServiceMappingRegistry.rb +510 -0
  68. data/lib/ysm4r/v2/AdGroupService.rb +649 -0
  69. data/lib/ysm4r/v2/AdGroupServiceDriver.rb +226 -0
  70. data/lib/ysm4r/v2/AdGroupServiceMappingRegistry.rb +864 -0
  71. data/lib/ysm4r/v2/AdService.rb +553 -0
  72. data/lib/ysm4r/v2/AdServiceDriver.rb +186 -0
  73. data/lib/ysm4r/v2/AdServiceMappingRegistry.rb +774 -0
  74. data/lib/ysm4r/v2/BasicReportService.rb +272 -0
  75. data/lib/ysm4r/v2/BasicReportServiceDriver.rb +98 -0
  76. data/lib/ysm4r/v2/BasicReportServiceMappingRegistry.rb +389 -0
  77. data/lib/ysm4r/v2/BidInformationService.rb +109 -0
  78. data/lib/ysm4r/v2/BidInformationServiceDriver.rb +66 -0
  79. data/lib/ysm4r/v2/BidInformationServiceMappingRegistry.rb +177 -0
  80. data/lib/ysm4r/v2/BudgetingService.rb +161 -0
  81. data/lib/ysm4r/v2/BudgetingServiceDriver.rb +98 -0
  82. data/lib/ysm4r/v2/BudgetingServiceMappingRegistry.rb +230 -0
  83. data/lib/ysm4r/v2/CampaignService.rb +644 -0
  84. data/lib/ysm4r/v2/CampaignServiceDriver.rb +210 -0
  85. data/lib/ysm4r/v2/CampaignServiceMappingRegistry.rb +909 -0
  86. data/lib/ysm4r/v2/CompanyService.rb +68 -0
  87. data/lib/ysm4r/v2/CompanyServiceDriver.rb +50 -0
  88. data/lib/ysm4r/v2/CompanyServiceMappingRegistry.rb +136 -0
  89. data/lib/ysm4r/v2/ExcludedWordsService.rb +294 -0
  90. data/lib/ysm4r/v2/ExcludedWordsServiceDriver.rb +122 -0
  91. data/lib/ysm4r/v2/ExcludedWordsServiceMappingRegistry.rb +469 -0
  92. data/lib/ysm4r/v2/ForecastService.rb +200 -0
  93. data/lib/ysm4r/v2/ForecastServiceDriver.rb +66 -0
  94. data/lib/ysm4r/v2/ForecastServiceMappingRegistry.rb +359 -0
  95. data/lib/ysm4r/v2/KeywordResearchService.rb +369 -0
  96. data/lib/ysm4r/v2/KeywordResearchServiceDriver.rb +82 -0
  97. data/lib/ysm4r/v2/KeywordResearchServiceMappingRegistry.rb +673 -0
  98. data/lib/ysm4r/v2/KeywordService.rb +691 -0
  99. data/lib/ysm4r/v2/KeywordServiceDriver.rb +226 -0
  100. data/lib/ysm4r/v2/KeywordServiceMappingRegistry.rb +934 -0
  101. data/lib/ysm4r/v2/LocationService.rb +53 -0
  102. data/lib/ysm4r/v2/LocationServiceDriver.rb +50 -0
  103. data/lib/ysm4r/v2/LocationServiceMappingRegistry.rb +111 -0
  104. data/lib/ysm4r/v2/MasterAccountService.rb +332 -0
  105. data/lib/ysm4r/v2/MasterAccountServiceDriver.rb +82 -0
  106. data/lib/ysm4r/v2/MasterAccountServiceMappingRegistry.rb +480 -0
  107. data/lib/ysm4r/v2/UpgradeService.rb +72 -0
  108. data/lib/ysm4r/v2/UpgradeServiceDriver.rb +58 -0
  109. data/lib/ysm4r/v2/UpgradeServiceMappingRegistry.rb +145 -0
  110. data/lib/ysm4r/v2/UserManagementService.rb +766 -0
  111. data/lib/ysm4r/v2/UserManagementServiceDriver.rb +290 -0
  112. data/lib/ysm4r/v2/UserManagementServiceMappingRegistry.rb +1057 -0
  113. data/lib/ysm4r/v2/sandbox/LocationService.rb +53 -0
  114. data/lib/ysm4r/v2/sandbox/LocationServiceDriver.rb +50 -0
  115. data/lib/ysm4r/v2/sandbox/LocationServiceMappingRegistry.rb +111 -0
  116. data/lib/ysm4r/v2/sandbox/UpgradeService.rb +72 -0
  117. data/lib/ysm4r/v2/sandbox/UpgradeServiceDriver.rb +58 -0
  118. data/lib/ysm4r/v2/sandbox/UpgradeServiceMappingRegistry.rb +145 -0
  119. data/setup.rb +1585 -0
  120. data/test/test_campaign_service.rb +12 -0
  121. data/test/test_keyword_research_service.rb +15 -0
  122. data/test/test_master_account_service.rb +18 -0
  123. data/ysm.properties +6 -0
  124. metadata +171 -0
@@ -0,0 +1,2 @@
1
+ "Brian Hawthorne" <brian.lee.hawthorne@gmail.com>
2
+ "Patrick Chanezon" <chanezon@google.com>
@@ -0,0 +1 @@
1
+ 0.1 -first version, supports YSM versions 1 and 2, not fully tested
@@ -0,0 +1,13 @@
1
+ Copyright 2007 Brian Hawthorne
2
+
3
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,209 @@
1
+ require 'rubygems'
2
+ gem 'soap4r'
3
+ require 'soap/compat'
4
+ require 'net/http'
5
+ require 'fileutils'
6
+ require 'rake/clean'
7
+ require 'rake/testtask'
8
+ begin
9
+ require 'rake/gempackagetask'
10
+ rescue Exception
11
+ nil
12
+ end
13
+ require 'lib/soapex/wsdl2ruby'
14
+ require 'lib/ysm4r/service'
15
+
16
+ CLOBBER.include('pkg')
17
+
18
+ # Determine the current version of the software
19
+ CURRENT_VERSION = '0.1'
20
+ PKG_VERSION = ENV['REL'] ? ENV['REL'] : CURRENT_VERSION
21
+
22
+ SRC_RB = FileList['lib/**/*.rb']
23
+
24
+ SANDBOX = true
25
+ WSDLDIR = 'wsdl'
26
+ LIBDIR = 'lib'
27
+ GENDIR = LIBDIR + '/ysm4r'
28
+
29
+ CLEAN.include(WSDLDIR)
30
+ YSM::Service.getVersions.each do |vnum|
31
+ CLEAN.include(File.join(GENDIR, "v#{vnum}"))
32
+ end
33
+
34
+ # The default task is run if rake is given no explicit arguments.
35
+ desc "Default task runs the unit tests."
36
+ task :default => [:test]
37
+
38
+ Rake::TestTask.new do |t|
39
+ t.libs << "test"
40
+ t.test_files = FileList['test/test*.rb']
41
+ t.verbose = true
42
+ end
43
+
44
+ desc "gets the wsdl files for YSM services"
45
+ task :getwsdl do
46
+ host = "searchmarketing.yahoo.com"
47
+ YSM::Service.getVersions.each do |vnum|
48
+ vname = "v#{vnum}"
49
+ mkdir_p(File.join(WSDLDIR, vname, "sandbox"))
50
+ YSM::Service.getServices(vnum).each do |s|
51
+ path = "/developer/docs/V#{vnum}/wsdl/V#{vnum}/#{s}Service.wsdl"
52
+ save(getfile(host, path), getWsdlFileName(vname,s))
53
+
54
+ # put sandbox wsdls in their own directory
55
+ if ["Location", "Upgrade"].include?(s)
56
+ path = "/developer/docs/V#{vnum}/wsdl-sandbox/V#{vnum}/#{s}Service.wsdl"
57
+ save(getfile(host, path), getWsdlFileName(vname, s, true))
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+
64
+ desc "generates YSM classes from the wsdl files"
65
+ task :generate do
66
+ YSM::Service.getVersions.each do |vnum|
67
+ vname = "v#{vnum}"
68
+ gendir = File.join(GENDIR, "v#{vnum}")
69
+ mkdir_p(File.join(gendir, "sandbox"))
70
+ YSM::Service.getServices(vnum).each do |name|
71
+ generateServiceFiles(gendir, vnum, name)
72
+ if ["Location", "Upgrade"].include?(name)
73
+ generateServiceFiles(gendir, vnum, name, true)
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ def generateServiceFiles(gendir, versionnum, servicename, sandbox=false)
80
+ versionname = "v#{versionnum}"
81
+ wsdlfilename = getWsdlFileName(versionname, servicename, sandbox)
82
+ sandbox = sandbox ? "sandbox" : ""
83
+ generator = SOAP::MultiService::WSDL2Ruby.new(File.join(gendir, sandbox), true)
84
+ generator.run(wsdlfilename, :modulepath=>"YSM::#{servicename}Service", :classdef=>nil, :mapping_registry=>nil, :driver=>nil)
85
+ fixFile(versionname, File.join(gendir, sandbox, "#{servicename}Service.rb"))
86
+ fixFile(versionname, File.join(gendir, sandbox, "#{servicename}ServiceMappingRegistry.rb"))
87
+ fixFile(versionname, File.join(gendir, sandbox, "#{servicename}ServiceDriver.rb"))
88
+ end
89
+
90
+ def filterFile(file)
91
+ tempfile = file + '.tmp'
92
+ outfile = File.new(tempfile,"w")
93
+ File.open(file, "r") do |infile|
94
+ yield(infile, outfile)
95
+ end
96
+ outfile.close
97
+ File.rename(tempfile, file)
98
+ end
99
+
100
+ def fixFile(versionname, file)
101
+ puts "fixing: #{file}"
102
+ filterFile(file) do |infile, outfile|
103
+ input = infile.read
104
+ # driver imports mapping registry instead of classdef file
105
+ if file =~ /Driver/
106
+ input.gsub!(/require \'(.*)Service/, 'require \'\1ServiceMappingRegistry')
107
+ end
108
+ # set proper requirepath (should be done by wsdl2ruby)
109
+ input.gsub!(/require \'(.*)Service(.*).rb\'/, 'require \'ysm4r/' + versionname + '/\1Service\2\'')
110
+ outfile.puts input
111
+ end
112
+ end
113
+
114
+
115
+ def getWsdlFileName(version, service, sandbox=false)
116
+ #(puts("getWsdlFilename(#{version.inspect}, #{service.inspect}, #{sandbox.inspect})")) if $DEBUG
117
+ sandbox = sandbox ? "sandbox" : ""
118
+ File.join(WSDLDIR, version, sandbox, service+".wsdl")
119
+ end
120
+
121
+ def getfile(host, path)
122
+ puts "getting http://#{host}#{path}"
123
+ http = Net::HTTP.new(host)
124
+ http.start { |w| w.get2(path).body }
125
+ end
126
+
127
+ def fixWsdl(wsdl)
128
+ ['type', 'base'].each do |name|
129
+ ['long', 'string', 'date', 'int', 'boolean'].each do |type|
130
+ wsdl.gsub!(Regexp.new("#{name}=\"#{type}\""),"#{name}=\"xsd:#{type}\"")
131
+ end
132
+ end
133
+ schema_ns = "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
134
+ if wsdl !~ Regexp.new(schema_ns)
135
+ wsdl.gsub!(/(<wsdl:definitions[^>]*)>/, '\1 ' + schema_ns + '>')
136
+ end
137
+ wsdl.gsub!("ServiceService", "Service")
138
+ wsdl
139
+ end
140
+
141
+ # Saves this document to the specified @var path.
142
+ #doesn't create the file if contains markup for google 404 page
143
+ def save(content, path)
144
+ if content !~ /<H2>Error 404<\/H2>/
145
+ File::open(path, 'w') {|f| f.write(fixWsdl(content))}
146
+ end
147
+ end
148
+
149
+ # ====================================================================
150
+ # Create a task that will package the Rake software into distributable
151
+ # gem files.
152
+
153
+ PKG_FILES = FileList[
154
+ '*.*',
155
+ 'Rakefile',
156
+ 'lib/**/*.rb',
157
+ 'examples/**/*.rb',
158
+ 'test/**/*.rb',
159
+ 'scripts/**/*.rb'
160
+ ]
161
+
162
+ PKG_FILES.exclude(/\._/)
163
+
164
+ if ! defined?(Gem)
165
+ puts "Package Target requires RubyGEMs"
166
+ else
167
+ spec = Gem::Specification.new do |s|
168
+
169
+ #### Basic information.
170
+
171
+ s.name = 'ysm4r'
172
+ s.version = PKG_VERSION
173
+ s.summary = "Client library for the Yahoo Search Marketing API."
174
+ s.description = %{\
175
+ Ysm4r provides a high-level Ruby interface to Yahoo's Search Marketing API.\
176
+ Currently the following API versions are supported:\
177
+ \
178
+ * V1\
179
+ * V2\
180
+ }
181
+
182
+ s.files = PKG_FILES.to_a
183
+ s.require_path = 'lib'
184
+ s.autorequire = 'ysm4r'
185
+
186
+ s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ }
187
+
188
+ #s.has_rdoc = true
189
+ s.has_rdoc = false
190
+ #s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
191
+ #s.rdoc_options <<
192
+ # '--title' << 'Builder -- Easy XML Building' <<
193
+ # '--main' << 'README' <<
194
+ # '--line-numbers'
195
+
196
+ s.author = "Brian Hawthorne"
197
+ s.homepage = "http://rubyforge.org/projects/ysm4r/"
198
+ s.requirements << 'soap4r v 1.5.6 or greater'
199
+ s.requirements << 'http-access2 v 2.0.5 or greater'
200
+ s.rubyforge_project = 'ysm4r'
201
+ end
202
+
203
+ Rake::GemPackageTask.new(spec) do |t|
204
+ t.need_tar = true
205
+ end
206
+ end
207
+
208
+ #require 'scripts/publish'
209
+
@@ -0,0 +1,4 @@
1
+ ysm4r: a Ruby client for Yahoo's Search Marketing API
2
+
3
+ Forked from Patrick Chanezon's Google AdWords client for ruby (adwords4r):
4
+ http://code.google.com/p/google-api-adwords-ruby/
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ rm -rf lib/ysm4r/v1/*
3
+ rm -rf lib/ysm4r/v2/*
@@ -0,0 +1,13 @@
1
+ require 'soap/rpc/driver'
2
+
3
+ module SOAP::RPC
4
+ class Driver
5
+ def prepare(headers, endpoint=nil)
6
+ self.proxy.endpoint_url = endpoint if endpoint
7
+ headers.each {|h| self.headerhandler << h}
8
+ (self.wiredump_dev = STDOUT) if $DEBUG
9
+ self.options['protocol.http.ssl_config.verify_mode'] = nil
10
+ (self.wiredump_file_base = "debug") if $DEBUG
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,49 @@
1
+ module SOAP::MultiService
2
+
3
+ # Generic error provides base class for more specific errors
4
+ # while still allowing a blanket rescue for any multiservice error.
5
+ class Error < StandardError; end
6
+
7
+ # Raised if a call is made to a method that does not exist in the multiservice API
8
+ class UnknownAPICall < Error; end
9
+
10
+ # Raised if an attempt is made to instantiate a type that does not exist in
11
+ # the multiservice SOAP API
12
+ class UnknownType < Error; end
13
+
14
+ # Raised if a call returns with a SOAP error
15
+ class ApiError < Error
16
+ attr_accessor :soap_faultcode
17
+ attr_accessor :soap_faultstring
18
+ attr_accessor :code
19
+ attr_accessor :internal
20
+ attr_accessor :message
21
+ attr_accessor :trigger
22
+ attr_accessor :violations
23
+
24
+ def initialize(fault)
25
+ @soap_faultcode = getOrNil(fault, 'faultcode')
26
+ @soap_faultstring = getOrNil(fault, 'faultstring')
27
+ @code = getOrNil(fault.detail, 'code')
28
+ @internal = getOrNil(fault.detail,'internal')
29
+ @message = @soap_faultstring #getOrNil(fault.detail,'message')
30
+ @message = getOrNil(fault.detail,'message')
31
+ @trigger = getOrNil(fault.detail,'trigger')
32
+ @violations = getOrNil(fault.detail,'violations')
33
+ end
34
+
35
+ def inspect
36
+ "#<SOAP::MultiService::ApiError: \"#{@code || @soap_faultstring || @message}\">"
37
+ end
38
+
39
+ def to_s
40
+ inspect
41
+ end
42
+
43
+ private
44
+ def getOrNil(obj, meth)
45
+ obj.respond_to?(meth) ? eval("obj.#{meth}") : nil
46
+ end
47
+ end
48
+ end
49
+
@@ -0,0 +1,31 @@
1
+ require 'soap/mapping/mapping'
2
+ require 'soap/mapping/registry'
3
+
4
+ def needspatch
5
+ SOAP::Mapping.set_attributes(a=[], :x=>10)
6
+ a != [10]
7
+ rescue Exception => e
8
+ true
9
+ end
10
+
11
+ if needspatch
12
+
13
+ # Apply mapping patch only if it has not already been applied.
14
+ class << SOAP::Mapping
15
+ alias set_attributes_old set_attributes
16
+ def set_attributes(obj, values)
17
+ if not obj.is_a?(::SOAP::Mapping::Object) and obj.kind_of?(Array)
18
+ values.each do |key, value|
19
+ if value.kind_of?(Array)
20
+ obj.concat(value)
21
+ else
22
+ obj << value
23
+ end
24
+ end
25
+ else
26
+ set_attributes_old(obj, values)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,166 @@
1
+ # WSDL4R - WSDL to ruby mapping library.
2
+ # Copyright (C) 2002-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'logger'
10
+ require 'xsd/qname'
11
+ require 'wsdl/importer'
12
+ require 'wsdl/soap/classDefCreator'
13
+ require 'wsdl/soap/servantSkeltonCreator'
14
+ require 'wsdl/soap/driverCreator'
15
+ require 'wsdl/soap/clientSkeltonCreator'
16
+ require 'wsdl/soap/standaloneServerStubCreator'
17
+ require 'wsdl/soap/cgiStubCreator'
18
+
19
+
20
+ module SOAP
21
+ module MultiService
22
+
23
+ class WSDL2Ruby
24
+ attr_reader :options, :logger, :basedir
25
+
26
+ Options = [:classdef, :mapping_registry, :driver, :client_skelton, :servant_skelton,
27
+ :standalone_server_stub, :cgi_stub]
28
+
29
+ def initialize(basedir, force=false, logger=nil)
30
+ @basedir = basedir
31
+ @force = force
32
+ @logger ||= Logger.new(STDERR)
33
+ end
34
+
35
+ def run(location, options={})
36
+ @modulepath = (options[:modulepath] || "")
37
+ @wsdl = import(location)
38
+ @servicename = @wsdl.services[0].name.name
39
+ Options.each do |optname|
40
+ if options.key?(optname)
41
+ servicename = (options[optname] || @servicename)
42
+ method("create_#{optname.to_s}".to_sym).call(servicename)
43
+ end
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def create_classdef(servicename)
50
+ @logger.info { "Creating class definition." }
51
+ @classdef_filename = servicename + '.rb'
52
+ write_file(@classdef_filename) do |f|
53
+ f << WSDL::SOAP::ClassDefCreator.new(@wsdl, @modulepath).dump
54
+ end
55
+ end
56
+
57
+ def create_mapping_registry(servicename)
58
+ @logger.info { "Creating mapping registry." }
59
+ @mapping_registry_filename = servicename + 'MappingRegistry.rb'
60
+ write_file(@mapping_registry_filename) do |f|
61
+ f << "require '#{@classdef_filename}'\n" if @classdef_filename
62
+ f << WSDL::SOAP::MappingRegistryCreator.new(@wsdl, @modulepath).dump
63
+ end
64
+ end
65
+
66
+ def create_driver(servicename)
67
+ @logger.info { "Creating driver." }
68
+ @driver_filename = servicename + 'Driver.rb'
69
+ write_file(@driver_filename) do |f|
70
+ f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
71
+ f << WSDL::SOAP::DriverCreator.new(@wsdl, @modulepath).dump(create_name(servicename))
72
+ end
73
+ end
74
+
75
+ def create_client_skelton(servicename)
76
+ @logger.info { "Creating client skelton." }
77
+ @client_skelton_filename = servicename + 'Client.rb'
78
+ write_file(@client_skelton_filename) do |f|
79
+ f << shbang << "\n"
80
+ f << "require '#{@driver_filename}'\n\n" if @driver_filename
81
+ f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl, @modulepath).dump(
82
+ create_name(servicename))
83
+ end
84
+ end
85
+
86
+ def create_servant_skelton(servicename)
87
+ @logger.info { "Creating servant skelton." }
88
+ @servant_skelton_filename = servicename + 'Servant' + '.rb'
89
+ write_file(@servant_skelton_filename) do |f|
90
+ f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
91
+ f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl, @modulepath).dump(
92
+ create_name(servicename))
93
+ end
94
+ end
95
+
96
+ def create_cgi_stub(servicename=nil)
97
+ @logger.info { "Creating CGI stub." }
98
+ @cgi_stubFilename = servicename + '.cgi'
99
+ write_file(@cgi_stubFilename) do |f|
100
+ f << shbang << "\n"
101
+ if @servant_skelton_filename
102
+ f << "require '#{@servant_skelton_filename}'\n\n"
103
+ end
104
+ f << WSDL::SOAP::CGIStubCreator.new(@wsdl, @modulepath).dump(create_name(servicename))
105
+ end
106
+ end
107
+
108
+ def create_standalone_server_stub(servicename=nil)
109
+ @logger.info { "Creating standalone stub." }
110
+ @standalone_server_stub_filename = servicename + '.rb'
111
+ write_file(@standalone_server_stub_filename) do |f|
112
+ f << shbang << "\n"
113
+ f << "require '#{@servant_skelton_filename}'\n\n" if @servant_skelton_filename
114
+ f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl, @modulepath).dump(
115
+ create_name(servicename))
116
+ end
117
+ end
118
+
119
+ def write_file(filename)
120
+ check_file(filename) or return
121
+
122
+ if @basedir
123
+ filename = File.join(basedir, filename)
124
+ end
125
+ File.open(filename, "w") do |f|
126
+ yield f
127
+ end
128
+ end
129
+
130
+ def check_file(filename)
131
+ if @basedir
132
+ filename = File.join(basedir, filename)
133
+ end
134
+ if FileTest.exist?(filename)
135
+ if @force
136
+ @logger.warn {
137
+ "File '#{filename}' exists but overrides it."
138
+ }
139
+ true
140
+ else
141
+ @logger.warn {
142
+ "File '#{filename}' exists. #{$0} did not override it."
143
+ }
144
+ false
145
+ end
146
+ else
147
+ @logger.info { "Creates file '#{filename}'." }
148
+ true
149
+ end
150
+ end
151
+
152
+ def shbang
153
+ "#!/usr/bin/env ruby"
154
+ end
155
+
156
+ def create_name(name)
157
+ name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil
158
+ end
159
+
160
+ def import(location)
161
+ WSDL::Importer.import(location)
162
+ end
163
+ end
164
+
165
+ end
166
+ end