File: argument_parsing.rst

package info (click to toggle)
suds 0.7~git20150727.94664dd-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,752 kB
  • ctags: 2,281
  • sloc: python: 18,083; makefile: 8
file content (157 lines) | stat: -rw-r--r-- 6,898 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
===================================================================
Notes on input argument usage when invoking a web service operation
===================================================================
:Authors: Jurko Gospodneti
:Date: 2014-01-23


===========
Definitions
===========

message parts
  WSDL schema defines message parts representing a web service operation's input
  data. Each such part's data structure is defined by mapping the message part
  to XSD element or type.

input parameters
  Suds library's view of a web service operation's input data. Each message part
  may correspond to 1 or more input parameters. See the `Bare/wrapped web
  service operation input parameters`_ section for more detailed information.

input arguments
  Values passed to suds library's Python function or function object invoking a
  web service operation. Suds attempts to map each input argument to a single
  web service operation input parameter.


===================================================
Bare/wrapped web service operation input parameters
===================================================

When suds library models a web service operation, it can be configured to map
each of its message parts to a single input parameter expecting values directly
matching the data type defined for that message part in the web service's WSDL
schema. Such input parameters are called ``bare``.

If a particular message part has a type which is actually a structure containing
a collection of simpler elements, then suds may be configured to map each of
those simpler elements to a single input parameter. Such input parameters are
called 'wrapped'.

If an input parameter is represented by structured XSD element containing other
elements, suds may treat it as either ``bare`` or ``wrapped``. If it is
considered ``wrapped``, then suds library's web service operation invocation
function will take values for the input parameter's internal elements as input
arguments, instead of taking only a single wrapper object as a value for the
external wrapper element.

``wrapped`` input parameter support has been implemented to make the interface
simpler for the user/programmer using suds to invoke web service operations. It
does not affect how the the resulting web service operation invocation request
is constructed, i.e. passing a suds object as a single ``bare`` input parameter
value, or passing matching contained element values as separate wrapped input
parameter values results in the same web service operation invocation request
being constructed.

Example:
--------

Consider an operation taking the following element as its only message part::

  <xsd:element name="unga">
    <sequence>
      <xsd:element name="a" type="xsd:string"/>
      <xsd:element name="b" type="xsd:integer"/>
      <xsd:element name="c" type="MyType"/>
    </xsd:sequence>
  </xsd:element>

Suds may be configured to map that message part into with a single ``bare`` or
three ``wrapped`` input parameters.

If a ``bare`` input parameter is used, the operation invocation function would
take only a single argument:

* a suds object argument for element ``unga``

If ``wrapped`` input parameters are used, the operation invocation function
would take the following input arguments:

* a string argument for element ``a``
* an integer argument for element ``b``
* a suds object argument for element ``c``


==================================================================
Input parameter values in original and current suds implementation
==================================================================

* A user may or may not specify a value for a specific input parameter.
* We refer to unspecified or ``None`` input parameter values as `undefined`.
* We refer to all other input parameter values `defined`.

Original suds library implementation:
-------------------------------------

* An element may be explicitly marked as optional.
* ``choice`` input parameter structures not supported.
* A defined input parameter value is used directly.
* An undefined optional input parameter value is ignored.
* An undefined non-optional input parameter value is interpreted as an empty
  string.
* Multiple values specified for a single input parameter are ignored.
* Extra input arguments are ignored.

Defects:

* ``choice`` input parameter structures not supported correctly. When used,
  result in incorrectly constructed web service operation invocation requests.
* An ``all``/``choice``/``sequence`` input parameter structure may be explicitly
  marked as optional, but this is ignored when deciding whether a specific input
  parameter inside that structure is optional or not.
* No error when multiple values are specified for a single input parameter.
* No error on extra input arguments.

Current suds library implementation:
------------------------------------

* An element may be explicitly marked as optional.
* ``choice`` input parameter structures supported.
* Input parameters contained inside a ``choice`` input parameter structure
  (either directly or indirectly) are always considered optional.
* An input parameter structure containing at least one input parameter with a
  defined value (either directly or indirectly) is considered to have a defined
  value.
* A defined input parameter value is used directly.
* An undefined optional input parameter value is ignored.
* An undefined non-optional input parameters value is treated as an empty
  string.

Configurable features:

* Multiple values specified for a single input parameter may be reported as an
  error.
* ``choice`` input parameter structure directly containing multiple input
  parameters and/or input parameter structures with defined values may be
  reported as an error.
* Extra input argument may be reported as an error.

Defects (demonstrated by existing unit tests):

* An ``all``/``choice``/``sequence`` input parameter structure may be explicitly
  marked as optional, but this is ignored when deciding whether a specific input
  parameter inside that structure is optional or not.
* Undefined value for a non-optional input parameter contained directly inside
  an ``all``/``sequence`` input parameter structure contained inside a
  ``choice`` input parameter structure should be treated as an empty string if
  the ``all``/``sequence`` input parameter structure has a defined value.
* A ``choice`` input parameter structure directly containing an input parameter
  structure with no elements should be considered optional.

Still missing features:
-----------------------

* Non-optional ``choice`` input parameter structure with no defined value should
  be treated as if its first input parameter's value had been specified as an
  empty string.