@autorest/python 6.13.4 → 6.13.6

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.
@@ -33,7 +33,7 @@ class PrimitiveType(BaseType): # pylint: disable=abstract-method
33
33
  return self.docstring_type(**kwargs)
34
34
 
35
35
  def docstring_text(self, **kwargs: Any) -> str:
36
- return self.docstring_type()
36
+ return self.docstring_type(**kwargs)
37
37
 
38
38
  def get_json_template_representation(
39
39
  self,
@@ -125,35 +125,36 @@ class BinaryType(PrimitiveType):
125
125
 
126
126
 
127
127
  class BinaryIteratorType(PrimitiveType):
128
- """Type returned by response if response is a streamed response"""
128
+ def _iterator_name(self, **kwargs: Any) -> str:
129
+ return "AsyncIterator" if kwargs.pop("async_mode") else "Iterator"
129
130
 
130
131
  @property
131
132
  def serialization_type(self) -> str:
132
133
  return "IO"
133
134
 
134
135
  def docstring_type(self, **kwargs: Any) -> str:
135
- return "AsyncIterator[bytes]" if kwargs.get("async_mode") else "Iterator[bytes]"
136
+ return f"{self._iterator_name(**kwargs)}[bytes]"
136
137
 
137
138
  def type_annotation(self, **kwargs: Any) -> str:
138
- return self.docstring_type(**kwargs)
139
+ return f"{self._iterator_name(**kwargs)}[bytes]"
139
140
 
140
141
  def docstring_text(self, **kwargs: Any) -> str:
141
- iterator = "Async iterator" if kwargs.get("async_mode") else "Iterator"
142
- return f"{iterator} of the response bytes"
142
+ return f"{self._iterator_name(**kwargs)}[bytes]"
143
143
 
144
144
  @property
145
145
  def default_template_representation_declaration(self) -> str:
146
- return self.get_declaration("Iterator[bytes]")
146
+ return self.get_declaration(b"bytes")
147
147
 
148
148
  def imports(self, **kwargs: Any) -> FileImport:
149
149
  file_import = FileImport(self.code_model)
150
- iterator = "AsyncIterator" if kwargs.get("async_mode") else "Iterator"
151
- file_import.add_submodule_import("typing", iterator, ImportType.STDLIB)
150
+ file_import.add_submodule_import(
151
+ "typing", self._iterator_name(**kwargs), ImportType.STDLIB
152
+ )
152
153
  return file_import
153
154
 
154
155
  @property
155
156
  def instance_check_template(self) -> str:
156
- return "isinstance({}, Iterator)"
157
+ return "getattr({}, '__aiter__', None) is not None or getattr({}, '__iter__', None) is not None"
157
158
 
158
159
 
159
160
  class AnyType(PrimitiveType):
@@ -155,7 +155,11 @@ class Response(BaseModel):
155
155
  else None
156
156
  )
157
157
  # use ByteIteratorType if we are returning a binary type
158
- if isinstance(type, BinaryType):
158
+ default_content_type = yaml_data.get("defaultContentType", "application/json")
159
+ if isinstance(type, BinaryType) or (
160
+ isinstance(type, ByteArraySchema)
161
+ and default_content_type != "application/json"
162
+ ):
159
163
  type = BinaryIteratorType(type.yaml_data, type.code_model)
160
164
  return cls(
161
165
  yaml_data=yaml_data,
@@ -361,7 +361,9 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
361
361
  "\n"
362
362
  )
363
363
  )
364
- docstring_type = param.docstring_type(async_mode=self.async_mode)
364
+ docstring_type = param.docstring_type(
365
+ async_mode=self.async_mode,
366
+ )
365
367
  description_list.append(
366
368
  f":{param.docstring_type_keyword} {param.client_name}: {docstring_type}"
367
369
  )
@@ -1112,12 +1114,12 @@ class _OperationSerializer(
1112
1114
  if response.headers:
1113
1115
  retval.append("")
1114
1116
  deserialize_code: List[str] = []
1115
- no_stream_logic = False
1117
+ stream_logic = True
1116
1118
  if builder.has_stream_response:
1117
1119
  if isinstance(response.type, ByteArraySchema):
1118
1120
  deserialized = f"{'await ' if self.async_mode else ''}response.read()"
1119
1121
  else:
1120
- no_stream_logic = True
1122
+ stream_logic = False
1121
1123
  if self.code_model.options["version_tolerant"]:
1122
1124
  deserialized = "response.iter_bytes()"
1123
1125
  else:
@@ -1171,7 +1173,7 @@ class _OperationSerializer(
1171
1173
  deserialize_code.append("else:")
1172
1174
  deserialize_code.append(" deserialized = None")
1173
1175
  if len(deserialize_code) > 0:
1174
- if builder.expose_stream_keyword and not no_stream_logic:
1176
+ if builder.expose_stream_keyword and stream_logic:
1175
1177
  retval.append("if _stream:")
1176
1178
  retval.append(" deserialized = response.iter_bytes()")
1177
1179
  retval.append("else:")
@@ -52,7 +52,7 @@ class PostProcessPlugin(Plugin): # pylint: disable=abstract-method
52
52
  env_builder = EnvBuilder(with_pip=True)
53
53
  self.venv_context = env_builder.ensure_directories(venv_path)
54
54
  else:
55
- env_builder = ExtendedEnvBuilder(with_pip=True)
55
+ env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
56
56
  env_builder.create(venv_path)
57
57
  self.venv_context = env_builder.context
58
58
  python_run(
@@ -20,7 +20,10 @@ class ExtendedEnvBuilder(venv.EnvBuilder):
20
20
 
21
21
  def __init__(self, *args, **kwargs):
22
22
  self.context = None
23
- super(ExtendedEnvBuilder, self).__init__(*args, **kwargs)
23
+ if sys.version_info < (3, 9, 0):
24
+ # Not supported on Python 3.8, and we don't need it
25
+ kwargs.pop("upgrade_deps", None)
26
+ super().__init__(*args, **kwargs)
24
27
 
25
28
  def ensure_directories(self, env_dir):
26
29
  self.context = super(ExtendedEnvBuilder, self).ensure_directories(env_dir)
@@ -34,6 +37,7 @@ def create(
34
37
  symlinks=False,
35
38
  with_pip=False,
36
39
  prompt=None,
40
+ upgrade_deps=False,
37
41
  ):
38
42
  """Create a virtual environment in a directory."""
39
43
  builder = ExtendedEnvBuilder(
@@ -42,6 +46,7 @@ def create(
42
46
  symlinks=symlinks,
43
47
  with_pip=with_pip,
44
48
  prompt=prompt,
49
+ upgrade_deps=upgrade_deps,
45
50
  )
46
51
  builder.create(env_dir)
47
52
  return builder.context
package/install.py CHANGED
@@ -6,7 +6,7 @@
6
6
  # license information.
7
7
  # --------------------------------------------------------------------------
8
8
  import sys
9
- if not sys.version_info >= (3, 7, 0):
9
+ if not sys.version_info >= (3, 8, 0):
10
10
  raise Exception("Autorest for Python extension requires Python 3.8 at least")
11
11
 
12
12
  try:
@@ -32,13 +32,12 @@ _ROOT_DIR = Path(__file__).parent
32
32
 
33
33
  def main():
34
34
  venv_path = _ROOT_DIR / "venv"
35
- venv_prexists = venv_path.exists()
36
35
 
37
- if venv_prexists:
36
+ if venv_path.exists():
38
37
  env_builder = venv.EnvBuilder(with_pip=True)
39
38
  venv_context = env_builder.ensure_directories(venv_path)
40
39
  else:
41
- env_builder = ExtendedEnvBuilder(with_pip=True)
40
+ env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
42
41
  env_builder.create(venv_path)
43
42
  venv_context = env_builder.context
44
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autorest/python",
3
- "version": "6.13.4",
3
+ "version": "6.13.6",
4
4
  "description": "The Python extension for generators in AutoRest.",
5
5
  "main": "index.js",
6
6
  "repository": {
package/start.py CHANGED
@@ -23,7 +23,7 @@ def main():
23
23
 
24
24
  assert venv_prexists # Otherwise install was not done
25
25
 
26
- env_builder = venv.EnvBuilder(with_pip=True)
26
+ env_builder = venv.EnvBuilder(with_pip=True, upgrade_deps=True)
27
27
  venv_context = env_builder.ensure_directories(venv_path)
28
28
  python_run(venv_context, "autorest.jsonrpc.server", command=sys.argv[1:])
29
29
 
package/venvtools.py CHANGED
@@ -21,6 +21,9 @@ class ExtendedEnvBuilder(venv.EnvBuilder):
21
21
 
22
22
  def __init__(self, *args, **kwargs):
23
23
  self.context = None
24
+ if sys.version_info < (3, 9, 0):
25
+ # Not supported on Python 3.8, and we don't need it
26
+ kwargs.pop("upgrade_deps", None)
24
27
  super().__init__(*args, **kwargs)
25
28
 
26
29
  def ensure_directories(self, env_dir):
@@ -29,11 +32,11 @@ class ExtendedEnvBuilder(venv.EnvBuilder):
29
32
 
30
33
 
31
34
  def create(env_dir, system_site_packages=False, clear=False,
32
- symlinks=False, with_pip=False, prompt=None):
35
+ symlinks=False, with_pip=False, prompt=None, upgrade_deps=False):
33
36
  """Create a virtual environment in a directory."""
34
37
  builder = ExtendedEnvBuilder(system_site_packages=system_site_packages,
35
38
  clear=clear, symlinks=symlinks, with_pip=with_pip,
36
- prompt=prompt)
39
+ prompt=prompt, upgrade_deps=upgrade_deps)
37
40
  builder.create(env_dir)
38
41
  return builder.context
39
42
 
@@ -44,7 +47,7 @@ def create_venv_with_package(packages):
44
47
  packages should be an iterable of pip version instructio (e.g. package~=1.2.3)
45
48
  """
46
49
  with tempfile.TemporaryDirectory() as tempdir:
47
- myenv = create(tempdir, with_pip=True)
50
+ myenv = create(tempdir, with_pip=True, upgrade_deps=True)
48
51
  pip_call = [
49
52
  myenv.env_exe,
50
53
  "-m",