ysm4r 0.1

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