yieldmanager 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.2
1
+ 0.8.3
@@ -0,0 +1,307 @@
1
+ # SOAP4R - SOAP XML Instance Generator library.
2
+ # Copyright (C) 2000-2007 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 'soap/soap'
10
+ require 'soap/ns'
11
+ require 'soap/baseData'
12
+ require 'soap/encodingstyle/handler'
13
+ require 'xsd/codegen/gensupport'
14
+
15
+
16
+ module SOAP
17
+
18
+
19
+ ###
20
+ ## CAUTION: MT-unsafe
21
+ #
22
+ class Generator
23
+ include SOAP
24
+ include XSD::CodeGen::GenSupport
25
+
26
+ class FormatEncodeError < Error; end
27
+
28
+ public
29
+
30
+ attr_accessor :charset
31
+ attr_accessor :default_encodingstyle
32
+ attr_accessor :generate_explicit_type
33
+ attr_accessor :use_numeric_character_reference
34
+ attr_accessor :use_default_namespace
35
+
36
+ def initialize(opt = {})
37
+ @reftarget = nil
38
+ @handlers = {}
39
+ @charset = opt[:charset] || XSD::Charset.xml_encoding_label
40
+ @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace
41
+ @generate_explicit_type =
42
+ opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true
43
+ @use_default_namespace = opt[:use_default_namespace]
44
+ @attributeformdefault = opt[:attributeformdefault]
45
+ @use_numeric_character_reference = opt[:use_numeric_character_reference]
46
+ @indentstr = opt[:no_indent] ? '' : ' '
47
+ @buf = @indent = @curr = nil
48
+ @default_ns = opt[:default_ns]
49
+ @default_ns_tag = opt[:default_ns_tag]
50
+ end
51
+
52
+ def generate(obj, io = nil)
53
+ @buf = io || ''
54
+ @indent = ''
55
+ @encode_char_regexp = get_encode_char_regexp()
56
+
57
+ prologue
58
+ @handlers.each do |uri, handler|
59
+ handler.encode_prologue
60
+ end
61
+
62
+ ns = SOAP::NS.new
63
+ if @default_ns
64
+ @default_ns.each_ns do |default_ns, default_tag|
65
+ Generator.assign_ns(obj.extraattr, ns, default_ns, default_tag)
66
+ end
67
+ end
68
+ if @default_ns_tag
69
+ @default_ns_tag.each_ns do |default_ns, default_tag|
70
+ ns.known_tag[default_ns] = default_tag
71
+ end
72
+ end
73
+ @buf << xmldecl
74
+ encode_data(ns, obj, nil)
75
+
76
+ @handlers.each do |uri, handler|
77
+ handler.encode_epilogue
78
+ end
79
+ epilogue
80
+
81
+ @buf
82
+ end
83
+
84
+ def encode_data(ns, obj, parent)
85
+ if obj.respond_to?(:to_xmlpart)
86
+ formatted = trim_eol(obj.to_xmlpart)
87
+ formatted = trim_indent(formatted)
88
+ formatted = formatted.gsub(/^/, @indent).sub(/\n+\z/, '')
89
+ @buf << "\n#{formatted}"
90
+ return
91
+ elsif obj.is_a?(SOAPEnvelopeElement)
92
+ encode_element(ns, obj, parent)
93
+ return
94
+ end
95
+ if @reftarget && !obj.precedents.empty?
96
+ add_reftarget(obj.elename.name, obj)
97
+ ref = SOAPReference.new(obj)
98
+ ref.elename = ref.elename.dup_name(obj.elename.name)
99
+ obj.precedents.clear # Avoid cyclic delay.
100
+ obj.encodingstyle = parent.encodingstyle
101
+ # SOAPReference is encoded here.
102
+ obj = ref
103
+ end
104
+ encodingstyle = obj.encodingstyle
105
+ # Children's encodingstyle is derived from its parent.
106
+ encodingstyle ||= parent.encodingstyle if parent
107
+ obj.encodingstyle = encodingstyle
108
+ handler = find_handler(encodingstyle || @default_encodingstyle)
109
+ unless handler
110
+ raise FormatEncodeError.new("Unknown encodingStyle: #{ encodingstyle }.")
111
+ end
112
+ if !obj.elename.name
113
+ raise FormatEncodeError.new("Element name not defined: #{ obj }.")
114
+ end
115
+ handler.encode_data(self, ns, obj, parent)
116
+ handler.encode_data_end(self, ns, obj, parent)
117
+ end
118
+
119
+ def add_reftarget(name, node)
120
+ unless @reftarget
121
+ raise FormatEncodeError.new("Reftarget is not defined.")
122
+ end
123
+ @reftarget.add(name, node)
124
+ end
125
+
126
+ def encode_child(ns, child, parent)
127
+ indent_backup, @indent = @indent, @indent + @indentstr
128
+ encode_data(ns.clone_ns, child, parent)
129
+ @indent = indent_backup
130
+ end
131
+
132
+ def encode_element(ns, obj, parent)
133
+ attrs = obj.extraattr
134
+ if obj.is_a?(SOAPBody)
135
+ @reftarget = obj
136
+ obj.encode(self, ns, attrs) do |child|
137
+ indent_backup, @indent = @indent, @indent + @indentstr
138
+ encode_data(ns.clone_ns, child, obj)
139
+ @indent = indent_backup
140
+ end
141
+ @reftarget = nil
142
+ else
143
+ if obj.is_a?(SOAPEnvelope)
144
+ # xsi:nil="true" can appear even if dumping without explicit type.
145
+ Generator.assign_ns(attrs, ns, XSD::InstanceNamespace)
146
+ if @generate_explicit_type
147
+ Generator.assign_ns(attrs, ns, XSD::Namespace)
148
+ end
149
+ end
150
+ obj.encode(self, ns, attrs) do |child|
151
+ indent_backup, @indent = @indent, @indent + @indentstr
152
+ encode_data(ns.clone_ns, child, obj)
153
+ @indent = indent_backup
154
+ end
155
+ end
156
+ end
157
+
158
+ def encode_name(ns, data, attrs)
159
+ if element_local?(data)
160
+ data.elename.name
161
+ else
162
+ if @use_default_namespace
163
+ Generator.assign_ns(attrs, ns, data.elename.namespace, '')
164
+ else
165
+ Generator.assign_ns(attrs, ns, data.elename.namespace)
166
+ end
167
+ ns.name(data.elename)
168
+ end
169
+ end
170
+
171
+ def encode_name_end(ns, data)
172
+ if element_local?(data)
173
+ data.elename.name
174
+ else
175
+ ns.name(data.elename)
176
+ end
177
+ end
178
+
179
+ def encode_tag(elename, attrs = nil)
180
+ if attrs.nil? or attrs.empty?
181
+ @buf << "\n#{ @indent }<#{ elename }>"
182
+ return
183
+ end
184
+ ary = []
185
+ attrs.each do |key, value|
186
+ ary << %Q[#{ key }="#{ get_encoded(value.to_s) }"]
187
+ end
188
+ case ary.size
189
+ when 0
190
+ @buf << "\n#{ @indent }<#{ elename }>"
191
+ when 1
192
+ @buf << %Q[\n#{ @indent }<#{ elename } #{ ary[0] }>]
193
+ else
194
+ @buf << "\n#{ @indent }<#{ elename } " <<
195
+ ary.join("\n#{ @indent }#{ @indentstr * 2 }") <<
196
+ '>'
197
+ end
198
+ end
199
+
200
+ def encode_tag_end(elename, cr = nil)
201
+ if cr
202
+ @buf << "\n#{ @indent }</#{ elename }>"
203
+ else
204
+ @buf << "</#{ elename }>"
205
+ end
206
+ end
207
+
208
+ def encode_rawstring(str)
209
+ @buf << str
210
+ end
211
+
212
+ def encode_string(str)
213
+ @buf << get_encoded(str)
214
+ end
215
+
216
+ def element_local?(element)
217
+ element.elename.namespace.nil?
218
+ end
219
+
220
+ def self.assign_ns(attrs, ns, namespace, tag = nil)
221
+ if namespace.nil?
222
+ raise FormatEncodeError.new("empty namespace")
223
+ end
224
+ override_default_ns = (tag == '' and namespace != ns.default_namespace)
225
+ if override_default_ns or !ns.assigned?(namespace)
226
+ assign_ns!(attrs, ns, namespace, tag)
227
+ end
228
+ end
229
+
230
+ def self.assign_ns!(attrs, ns, namespace, tag = nil)
231
+ tag = ns.assign(namespace, tag)
232
+ if tag == ''
233
+ attr = 'xmlns'
234
+ else
235
+ attr = "xmlns:#{tag}"
236
+ end
237
+ attrs[attr] = namespace
238
+ end
239
+
240
+ private
241
+
242
+ def prologue
243
+ end
244
+
245
+ def epilogue
246
+ end
247
+
248
+ ENCODE_CHAR_REGEXP = {}
249
+
250
+ EncodeMap = {
251
+ '&' => '&amp;',
252
+ '<' => '&lt;',
253
+ '>' => '&gt;',
254
+ '"' => '&quot;',
255
+ '\'' => '&apos;',
256
+ "\r" => '&#xd;'
257
+ }
258
+
259
+ def get_encoded(str)
260
+ if @use_numeric_character_reference and !XSD::Charset.is_us_ascii(str)
261
+ str.gsub!(@encode_char_regexp) { |c| EncodeMap[c] }
262
+ str.unpack("U*").collect { |c|
263
+ if c == 0x9 or c == 0xa or c == 0xd or (c >= 0x20 and c <= 0x7f)
264
+ c.chr
265
+ else
266
+ sprintf("&#x%x;", c)
267
+ end
268
+ }.join
269
+ else
270
+ str.gsub(@encode_char_regexp) { |c| EncodeMap[c] }
271
+ end
272
+ end
273
+
274
+ def get_encode_char_regexp
275
+ ENCODE_CHAR_REGEXP[XSD::Charset.encoding] ||=
276
+ # PATCH TO SUPPORT 1.9
277
+ # Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding)
278
+ Regexp.new("[#{EncodeMap.keys.join}]")
279
+ #
280
+ end
281
+
282
+ def find_handler(encodingstyle)
283
+ unless @handlers.key?(encodingstyle)
284
+ factory = SOAP::EncodingStyle::Handler.handler(encodingstyle)
285
+ if factory
286
+ handler = factory.new(@charset)
287
+ handler.generate_explicit_type = @generate_explicit_type
288
+ handler.encode_prologue
289
+ @handlers[encodingstyle] = handler
290
+ end
291
+ end
292
+ @handlers[encodingstyle]
293
+ end
294
+
295
+ def xmldecl
296
+ if @charset
297
+ %Q[<?xml version="1.0" encoding="#{ @charset }" ?>]
298
+ else
299
+ %Q[<?xml version="1.0" ?>]
300
+ end
301
+ end
302
+ end
303
+
304
+ SOAPGenerator = Generator # for backward compatibility
305
+
306
+
307
+ end
@@ -0,0 +1,340 @@
1
+ # soap/property.rb: SOAP4R - Property implementation.
2
+ # Copyright (C) 2000-2007 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
+ module SOAP
10
+
11
+
12
+ # Property stream format:
13
+ #
14
+ # line separator is \r?\n. 1 line per a property.
15
+ # line which begins with '#' is a comment line. empty line is ignored, too.
16
+ # key/value separator is ':' or '='.
17
+ # '\' as escape character. but line separator cannot be escaped.
18
+ # \s at the head/tail of key/value are trimmed.
19
+ #
20
+ # '[' + key + ']' indicates property section. for example,
21
+ #
22
+ # [aaa.bbb]
23
+ # ccc = ddd
24
+ # eee.fff = ggg
25
+ # []
26
+ # aaa.hhh = iii
27
+ #
28
+ # is the same as;
29
+ #
30
+ # aaa.bbb.ccc = ddd
31
+ # aaa.bbb.eee.fff = ggg
32
+ # aaa.hhh = iii
33
+ #
34
+ class Property
35
+ FrozenError = (RUBY_VERSION >= "1.9.0") ? RuntimeError : TypeError
36
+
37
+ include Enumerable
38
+
39
+ module Util
40
+ def const_from_name(fqname)
41
+ fqname.split("::").inject(Kernel) { |klass, name| klass.const_get(name) }
42
+ end
43
+ module_function :const_from_name
44
+
45
+ def require_from_name(fqname)
46
+ require File.join(fqname.split("::").collect { |ele| ele.downcase })
47
+ end
48
+ module_function :require_from_name
49
+ end
50
+
51
+ def self.load(stream)
52
+ new.load(stream)
53
+ end
54
+
55
+ def self.loadproperty(propname)
56
+ new.loadproperty(propname)
57
+ end
58
+
59
+ def initialize
60
+ @store = Hash.new
61
+ @hook = Hash.new
62
+ @self_hook = Array.new
63
+ @locked = false
64
+ end
65
+
66
+ KEY_REGSRC = '([^=:\\\\]*(?:\\\\.[^=:\\\\]*)*)'
67
+ DEF_REGSRC = '\\s*' + KEY_REGSRC + '\\s*[=:]\\s*(.*)'
68
+ # PATCH TO SUPPORT 1.9
69
+ # COMMENT_REGEXP = Regexp.new('^(?:#.*|)$', nil, 'u')
70
+ # CATDEF_REGEXP = Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$", nil, 'u')
71
+ # LINE_REGEXP = Regexp.new("^#{DEF_REGSRC}$", nil, 'u')
72
+ COMMENT_REGEXP = Regexp.new("^(?:#.*|)$")
73
+ CATDEF_REGEXP = Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$")
74
+ LINE_REGEXP = Regexp.new("^#{DEF_REGSRC}$")
75
+ #
76
+
77
+ def load(stream)
78
+ key_prefix = ""
79
+ stream.each_with_index do |line, lineno|
80
+ line.sub!(/\r?\n\z/u, '')
81
+ case line
82
+ when COMMENT_REGEXP
83
+ next
84
+ when CATDEF_REGEXP
85
+ key_prefix = $1.strip
86
+ when LINE_REGEXP
87
+ key, value = $1.strip, $2.strip
88
+ key = "#{key_prefix}.#{key}" unless key_prefix.empty?
89
+ key, value = loadstr(key), loadstr(value)
90
+ self[key] = value
91
+ else
92
+ raise TypeError.new(
93
+ "property format error at line #{lineno + 1}: `#{line}'")
94
+ end
95
+ end
96
+ self
97
+ end
98
+
99
+ # find property from $:.
100
+ def loadproperty(propname)
101
+ return loadpropertyfile(propname) if File.file?(propname)
102
+ $:.each do |path|
103
+ if File.file?(file = File.join(path, propname))
104
+ return loadpropertyfile(file)
105
+ end
106
+ end
107
+ nil
108
+ end
109
+
110
+ # name: a Symbol, String or an Array
111
+ def [](name)
112
+ referent(name_to_a(name))
113
+ end
114
+
115
+ # name: a Symbol, String or an Array
116
+ # value: an Object
117
+ def []=(name, value)
118
+ name_pair = name_to_a(name).freeze
119
+ hooks = assign(name_pair, value)
120
+ hooks.each do |hook|
121
+ hook.call(name_pair, value)
122
+ end
123
+ value
124
+ end
125
+
126
+ # value: an Object
127
+ # key is generated by property
128
+ def <<(value)
129
+ self[generate_new_key] = value
130
+ end
131
+
132
+ # name: a Symbol, String or an Array; nil means hook to the root
133
+ # cascade: true/false; for cascading hook of sub key
134
+ # hook: block which will be called with 2 args, name and value
135
+ def add_hook(name = nil, cascade = false, &hook)
136
+ if name == nil or name == true or name == false
137
+ cascade = name
138
+ assign_self_hook(cascade, &hook)
139
+ else
140
+ assign_hook(name_to_a(name), cascade, &hook)
141
+ end
142
+ end
143
+
144
+ def each
145
+ @store.each do |key, value|
146
+ yield(key, value)
147
+ end
148
+ end
149
+
150
+ def empty?
151
+ @store.empty?
152
+ end
153
+
154
+ def keys
155
+ @store.keys
156
+ end
157
+
158
+ def values
159
+ @store.values
160
+ end
161
+
162
+ def lock(cascade = false)
163
+ if cascade
164
+ each_key do |key|
165
+ key.lock(cascade)
166
+ end
167
+ end
168
+ @locked = true
169
+ self
170
+ end
171
+
172
+ def unlock(cascade = false)
173
+ @locked = false
174
+ if cascade
175
+ each_key do |key|
176
+ key.unlock(cascade)
177
+ end
178
+ end
179
+ self
180
+ end
181
+
182
+ def locked?
183
+ @locked
184
+ end
185
+
186
+ protected
187
+
188
+ def deref_key(key)
189
+ check_lock(key)
190
+ ref = @store[key] ||= self.class.new
191
+ unless propkey?(ref)
192
+ raise ArgumentError.new("key `#{key}' already defined as a value")
193
+ end
194
+ ref
195
+ end
196
+
197
+ def local_referent(key)
198
+ check_lock(key)
199
+ if propkey?(@store[key]) and @store[key].locked?
200
+ raise FrozenError.new("cannot split any key from locked property")
201
+ end
202
+ @store[key]
203
+ end
204
+
205
+ def local_assign(key, value)
206
+ check_lock(key)
207
+ if @locked
208
+ if propkey?(value)
209
+ raise FrozenError.new("cannot add any key to locked property")
210
+ elsif propkey?(@store[key])
211
+ raise FrozenError.new("cannot override any key in locked property")
212
+ end
213
+ end
214
+ @store[key] = value
215
+ end
216
+
217
+ def local_hook(key, direct)
218
+ hooks = []
219
+ (@self_hook + (@hook[key] || NO_HOOK)).each do |hook, cascade|
220
+ hooks << hook if direct or cascade
221
+ end
222
+ hooks
223
+ end
224
+
225
+ def local_assign_hook(key, cascade, &hook)
226
+ check_lock(key)
227
+ @store[key] ||= nil
228
+ (@hook[key] ||= []) << [hook, cascade]
229
+ end
230
+
231
+ private
232
+
233
+ NO_HOOK = [].freeze
234
+
235
+ def referent(ary)
236
+ ary[0..-2].inject(self) { |ref, name|
237
+ ref.deref_key(to_key(name))
238
+ }.local_referent(to_key(ary.last))
239
+ end
240
+
241
+ def assign(ary, value)
242
+ ref = self
243
+ hook = NO_HOOK
244
+ ary[0..-2].each do |name|
245
+ key = to_key(name)
246
+ hook += ref.local_hook(key, false)
247
+ ref = ref.deref_key(key)
248
+ end
249
+ last_key = to_key(ary.last)
250
+ ref.local_assign(last_key, value)
251
+ hook + ref.local_hook(last_key, true)
252
+ end
253
+
254
+ def assign_hook(ary, cascade, &hook)
255
+ ary[0..-2].inject(self) { |ref, name|
256
+ ref.deref_key(to_key(name))
257
+ }.local_assign_hook(to_key(ary.last), cascade, &hook)
258
+ end
259
+
260
+ def assign_self_hook(cascade, &hook)
261
+ check_lock(nil)
262
+ @self_hook << [hook, cascade]
263
+ end
264
+
265
+ def each_key
266
+ self.each do |key, value|
267
+ if propkey?(value)
268
+ yield(value)
269
+ end
270
+ end
271
+ end
272
+
273
+ def check_lock(key)
274
+ if @locked and (key.nil? or !@store.key?(key))
275
+ raise FrozenError.new("cannot add any key to locked property")
276
+ end
277
+ end
278
+
279
+ def propkey?(value)
280
+ value.is_a?(::SOAP::Property)
281
+ end
282
+
283
+ def name_to_a(name)
284
+ case name
285
+ when Symbol
286
+ [name]
287
+ when String
288
+ name.scan(/[^.\\]+(?:\\.[^.\\])*/u) # split with unescaped '.'
289
+ when Array
290
+ name
291
+ else
292
+ raise ArgumentError.new("Unknown name #{name}(#{name.class})")
293
+ end
294
+ end
295
+
296
+ def to_key(name)
297
+ name.to_s.downcase
298
+ end
299
+
300
+ def generate_new_key
301
+ if @store.empty?
302
+ "0"
303
+ else
304
+ (key_max + 1).to_s
305
+ end
306
+ end
307
+
308
+ def key_max
309
+ (@store.keys.max { |l, r| l.to_s.to_i <=> r.to_s.to_i }).to_s.to_i
310
+ end
311
+
312
+ def loadpropertyfile(file)
313
+ puts "find property at #{file}" if $DEBUG
314
+ File.open(file) do |f|
315
+ load(f)
316
+ end
317
+ end
318
+
319
+ def loadstr(str)
320
+ str.gsub(/\\./u) { |c| eval("\"#{c}\"") }
321
+ end
322
+ end
323
+
324
+
325
+ end
326
+
327
+
328
+ # for ruby/1.6.
329
+ unless Enumerable.instance_methods.include?('inject')
330
+ module Enumerable
331
+ def inject(init)
332
+ result = init
333
+ each do |item|
334
+ result = yield(result, item)
335
+ end
336
+ result
337
+ end
338
+ end
339
+ end
340
+
@@ -0,0 +1,190 @@
1
+ # XSD4R - Charset handling library.
2
+ # Copyright (C) 2000-2007 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
+ module XSD
10
+
11
+
12
+ module Charset
13
+ @internal_encoding = "UTF8"
14
+
15
+ class XSDError < StandardError; end
16
+ class CharsetError < XSDError; end
17
+ class UnknownCharsetError < CharsetError; end
18
+ class CharsetConversionError < CharsetError; end
19
+
20
+ public
21
+
22
+ ###
23
+ ## Maps
24
+ #
25
+ EncodingConvertMap = {}
26
+ def Charset.init
27
+ EncodingConvertMap[['UTF8', 'X_ISO_8859_1']] =
28
+ Proc.new { |str| str.unpack('U*').pack('C*') }
29
+ EncodingConvertMap[['X_ISO_8859_1', 'UTF8']] =
30
+ Proc.new { |str| str.unpack('C*').pack('U*') }
31
+ begin
32
+ require 'xsd/iconvcharset'
33
+ @internal_encoding = 'UTF8'
34
+ sjtag = (/(mswin|bccwin|mingw|cygwin|emx)/ =~ RUBY_PLATFORM) ? 'cp932' :
35
+ 'shift_jis'
36
+ EncodingConvertMap[['UTF8', 'EUC' ]] =
37
+ Proc.new { |str| IconvCharset.safe_iconv("euc-jp", "utf-8", str) }
38
+ EncodingConvertMap[['EUC' , 'UTF8']] =
39
+ Proc.new { |str| IconvCharset.safe_iconv("utf-8", "euc-jp", str) }
40
+ EncodingConvertMap[['EUC' , 'SJIS']] =
41
+ Proc.new { |str| IconvCharset.safe_iconv(sjtag, "euc-jp", str) }
42
+ EncodingConvertMap[['UTF8', 'SJIS']] =
43
+ Proc.new { |str| IconvCharset.safe_iconv(sjtag, "utf-8", str) }
44
+ EncodingConvertMap[['SJIS', 'UTF8']] =
45
+ Proc.new { |str| IconvCharset.safe_iconv("utf-8", sjtag, str) }
46
+ EncodingConvertMap[['SJIS', 'EUC' ]] =
47
+ Proc.new { |str| IconvCharset.safe_iconv("euc-jp", sjtag, str) }
48
+ rescue LoadError
49
+ begin
50
+ require 'nkf'
51
+ EncodingConvertMap[['EUC' , 'SJIS']] =
52
+ Proc.new { |str| NKF.nkf('-sXm0', str) }
53
+ EncodingConvertMap[['SJIS', 'EUC' ]] =
54
+ Proc.new { |str| NKF.nkf('-eXm0', str) }
55
+ rescue LoadError
56
+ end
57
+
58
+ begin
59
+ require 'uconv'
60
+ @internal_encoding = 'UTF8'
61
+ EncodingConvertMap[['UTF8', 'EUC' ]] = Uconv.method(:u8toeuc)
62
+ EncodingConvertMap[['UTF8', 'SJIS']] = Uconv.method(:u8tosjis)
63
+ EncodingConvertMap[['EUC' , 'UTF8']] = Uconv.method(:euctou8)
64
+ EncodingConvertMap[['SJIS', 'UTF8']] = Uconv.method(:sjistou8)
65
+ rescue LoadError
66
+ end
67
+ end
68
+ end
69
+ self.init
70
+
71
+ CharsetMap = {
72
+ 'NONE' => 'us-ascii',
73
+ 'EUC' => 'euc-jp',
74
+ 'SJIS' => 'shift_jis',
75
+ 'UTF8' => 'utf-8',
76
+ 'X_ISO_8859_1' => 'iso-8859-1',
77
+ 'X_UNKNOWN' => nil,
78
+ }
79
+
80
+ CharsetStrCache = {}
81
+
82
+
83
+ ###
84
+ ## handlers
85
+ #
86
+ def Charset.encoding
87
+ @internal_encoding
88
+ end
89
+
90
+ def Charset.encoding=(encoding)
91
+ warn("xsd charset is set to #{encoding}") if $DEBUG
92
+ @internal_encoding = encoding
93
+ end
94
+
95
+ def Charset.xml_encoding_label
96
+ charset_label(@internal_encoding)
97
+ end
98
+
99
+ def Charset.encoding_to_xml(str, charset)
100
+ encoding_conv(str, @internal_encoding, charset_str(charset))
101
+ end
102
+
103
+ def Charset.encoding_from_xml(str, charset)
104
+ encoding_conv(str, charset_str(charset), @internal_encoding)
105
+ end
106
+
107
+ def Charset.encoding_conv(str, enc_from, enc_to)
108
+ if enc_from == enc_to or enc_from == 'NONE' or enc_to == 'NONE'
109
+ str
110
+ elsif converter = EncodingConvertMap[[enc_from, enc_to]]
111
+ converter.call(str)
112
+ else
113
+ raise CharsetConversionError.new(
114
+ "Converter not found: #{enc_from} -> #{enc_to}")
115
+ end
116
+ end
117
+
118
+ def Charset.charset_label(encoding)
119
+ CharsetMap[encoding.upcase]
120
+ end
121
+
122
+ def Charset.charset_str(label)
123
+ if CharsetMap.respond_to?(:key)
124
+ CharsetStrCache[label] ||= CharsetMap.key(label.downcase) || 'X_UNKNOWN'
125
+ else
126
+ CharsetStrCache[label] ||= CharsetMap.index(label.downcase) || 'X_UNKNOWN'
127
+ end
128
+ end
129
+
130
+ # us_ascii = '[\x00-\x7F]'
131
+ us_ascii = '[\x9\xa\xd\x20-\x7F]' # XML 1.0 restricted.
132
+ USASCIIRegexp = Regexp.new("\\A#{us_ascii}*\\z", nil, 'NONE')
133
+
134
+ twobytes_euc = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'
135
+ threebytes_euc = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'
136
+ character_euc = "(?:#{us_ascii}|#{twobytes_euc}|#{threebytes_euc})"
137
+ EUCRegexp = Regexp.new("\\A#{character_euc}*\\z", nil, 'NONE')
138
+
139
+ # onebyte_sjis = '[\x00-\x7F\xA1-\xDF]'
140
+ onebyte_sjis = '[\x9\xa\xd\x20-\x7F\xA1-\xDF]' # XML 1.0 restricted.
141
+ twobytes_sjis = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'
142
+ character_sjis = "(?:#{onebyte_sjis}|#{twobytes_sjis})"
143
+ SJISRegexp = Regexp.new("\\A#{character_sjis}*\\z", nil, 'NONE')
144
+
145
+ # 0xxxxxxx
146
+ # 110yyyyy 10xxxxxx
147
+ twobytes_utf8 = '(?:[\xC0-\xDF][\x80-\xBF])'
148
+ # 1110zzzz 10yyyyyy 10xxxxxx
149
+ threebytes_utf8 = '(?:[\xE0-\xEF][\x80-\xBF][\x80-\xBF])'
150
+ # 11110uuu 10uuuzzz 10yyyyyy 10xxxxxx
151
+ fourbytes_utf8 = '(?:[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF])'
152
+ character_utf8 =
153
+ "(?:#{us_ascii}|#{twobytes_utf8}|#{threebytes_utf8}|#{fourbytes_utf8})"
154
+ UTF8Regexp = Regexp.new("\\A#{character_utf8}*\\z", nil, 'NONE')
155
+
156
+ def Charset.is_us_ascii(str)
157
+ USASCIIRegexp =~ str
158
+ end
159
+
160
+ def Charset.is_utf8(str)
161
+ UTF8Regexp =~ str
162
+ end
163
+
164
+ def Charset.is_euc(str)
165
+ EUCRegexp =~ str
166
+ end
167
+
168
+ def Charset.is_sjis(str)
169
+ SJISRegexp =~ str
170
+ end
171
+
172
+ def Charset.is_ces(str, code = @internal_encoding)
173
+ case code
174
+ when 'NONE'
175
+ is_us_ascii(str)
176
+ when 'UTF8'
177
+ is_utf8(str)
178
+ when 'EUC'
179
+ is_euc(str)
180
+ when 'SJIS'
181
+ is_sjis(str)
182
+ else
183
+ raise UnknownCharsetError.new("Unknown charset: #{code}")
184
+ end
185
+ end
186
+ end
187
+
188
+
189
+ end
190
+
@@ -0,0 +1,79 @@
1
+ # XSD4R - XML Instance parser library.
2
+ # Copyright (C) 2000-2007 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 'xsd/xmlparser/parser'
10
+
11
+
12
+ module XSD
13
+
14
+
15
+ module XMLParser
16
+ def create_parser(host, opt)
17
+ XSD::XMLParser::Parser.create_parser(host, opt)
18
+ end
19
+ module_function :create_parser
20
+
21
+ # $1 is necessary.
22
+ NSParseRegexp = Regexp.new('^xmlns:?(.*)$', nil, 'NONE')
23
+
24
+ def filter_ns(ns, attrs)
25
+ ns_updated = false
26
+ if attrs.nil? or attrs.empty?
27
+ return [ns, attrs]
28
+ end
29
+ newattrs = {}
30
+ attrs.each do |key, value|
31
+ if NSParseRegexp =~ key
32
+ unless ns_updated
33
+ ns = ns.clone_ns
34
+ ns_updated = true
35
+ end
36
+ # tag == '' means 'default namespace'
37
+ # value == '' means 'no default namespace'
38
+ tag = $1 || ''
39
+ ns.assign(value, tag)
40
+ else
41
+ newattrs[key] = value
42
+ end
43
+ end
44
+ return [ns, newattrs]
45
+ end
46
+ module_function :filter_ns
47
+ end
48
+
49
+
50
+ end
51
+
52
+
53
+ # Try to load XML processor.
54
+ loaded = false
55
+ [
56
+ 'xsd/xmlparser/xmlparser',
57
+ 'xsd/xmlparser/xmlscanner',
58
+ 'xsd/xmlparser/rexmlparser',
59
+ ].each do |lib|
60
+ begin
61
+ require lib
62
+ # XXX: for a workaround of rubygems' require inconsistency
63
+ # XXX: MUST BE REMOVED IN THE FUTURE
64
+ name = lib.sub(/^.*\//, '')
65
+ raise LoadError unless XSD::XMLParser.constants.find { |c|
66
+ # PATCHING TO HANDLE 1.9
67
+ #c.downcase == name
68
+ c.to_s.downcase == name
69
+ #
70
+ }
71
+ loaded = true
72
+ break
73
+ rescue LoadError
74
+ end
75
+ end
76
+ unless loaded
77
+ raise RuntimeError.new("XML processor module not found.")
78
+ end
79
+
data/lib/yieldmanager.rb CHANGED
@@ -12,6 +12,14 @@ end
12
12
  require 'patch_detector'
13
13
  include PatchDetector
14
14
 
15
+ if (RUBY_VERSION.start_with?("1.9"))
16
+ #
17
+ # This patch based on Tomer Doron's "Fixing soap4r for ruby 1.9" post
18
+ # http://tomerdoron.blogspot.com/2009/10/fixing-soap4r-for-ruby-19.html
19
+ #
20
+ $LOAD_PATH.unshift 'lib/soap4r_19_patch'
21
+ end
22
+
15
23
  require 'yieldmanager/client'
16
24
 
17
25
  if needs_patching?(:ruby_version => RUBY_VERSION, :minimum_ruby_version_for_patch => "1.8.7")
data/spec/spec_helper.rb CHANGED
@@ -9,7 +9,7 @@ begin
9
9
  rescue LoadError
10
10
  require 'rspec'
11
11
  require 'rspec/autorun'
12
- Rspec.configure do |config|
12
+ RSpec.configure do |config|
13
13
  end
14
14
  end
15
15
  require 'patch_detector'
data/yieldmanager.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{yieldmanager}
8
- s.version = "0.8.2"
8
+ s.version = "0.8.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bill Gathen"]
12
- s.date = %q{2011-05-11}
12
+ s.date = %q{2011-05-18}
13
13
  s.description = %q{This gem offers full access to YieldManager's API tools (read/write) as well as ad-hoc reporting through the Reportware tool}
14
14
  s.email = %q{bill@billgathen.com}
15
15
  s.extra_rdoc_files = [
@@ -27,6 +27,10 @@ Gem::Specification.new do |s|
27
27
  "TODO",
28
28
  "VERSION",
29
29
  "lib/patch_detector.rb",
30
+ "lib/soap4r_19_patch/soap/generator.rb",
31
+ "lib/soap4r_19_patch/soap/property.rb",
32
+ "lib/soap4r_19_patch/xsd/charset.rb",
33
+ "lib/soap4r_19_patch/xsd/xmlparser.rb",
30
34
  "lib/wsdl/patch.rb",
31
35
  "lib/yieldmanager.rb",
32
36
  "lib/yieldmanager/builder.rb",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yieldmanager
3
3
  version: !ruby/object:Gem::Version
4
- hash: 59
4
+ hash: 57
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 2
10
- version: 0.8.2
9
+ - 3
10
+ version: 0.8.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bill Gathen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-11 00:00:00 -04:00
18
+ date: 2011-05-18 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -70,6 +70,10 @@ files:
70
70
  - TODO
71
71
  - VERSION
72
72
  - lib/patch_detector.rb
73
+ - lib/soap4r_19_patch/soap/generator.rb
74
+ - lib/soap4r_19_patch/soap/property.rb
75
+ - lib/soap4r_19_patch/xsd/charset.rb
76
+ - lib/soap4r_19_patch/xsd/xmlparser.rb
73
77
  - lib/wsdl/patch.rb
74
78
  - lib/yieldmanager.rb
75
79
  - lib/yieldmanager/builder.rb