Coder Social home page Coder Social logo

conjure-python's People

Contributors

afloren-palantir avatar ahggns avatar alexandreguinaudeau avatar crogers avatar dansanduleac avatar ferozco avatar gabeboning avatar gm2211 avatar gsilvasimoespt avatar hdobbelaere avatar iamdanfox avatar jaceklach avatar jliu-palantir avatar johnhany97 avatar lorenzomartini avatar markgrex avatar matthewbayer avatar nmiyake avatar pnepywoda avatar robert3005 avatar svc-autorelease avatar svc-excavator-bot avatar tjb9dc avatar tom-s-powell avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

conjure-python's Issues

Conjure python types are not picklable

What happened?

#317 broke pickling of conjure types

>>> from ontology_metadata_api.ontology_metadata_api import RuleSetBinding
>>> binding = RuleSetBinding(bindings={}, rule_set_rid="some.rid")
>>>
>>> import pickle
>>> pickle.dumps(binding, pickle.HIGHEST_PROTOCOL)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'ontology_metadata_api.ontology_metadata_api.ontology_metadata_api_RuleSetBinding'>: attribute lookup ontology_metadata_api_RuleSetBinding on ontology_metadata_api.ontology_metadata_api failed

This is because:

>>> binding.__class__
<class 'ontology_metadata_api.ontology_metadata_api.ontology_metadata_api_RuleSetBinding'>

__class__ points to a reference that is not valid

Fix:

>>> binding.__class__.__name__
'RuleSetBinding'
>>> binding.__class__.__qualname__
'ontology_metadata_api_RuleSetBinding'
>>> binding.__class__.__qualname__ = binding.__class__.__name__
>>> binding.__class__
<class 'ontology_metadata_api.ontology_metadata_api.RuleSetBinding'>
>>> pickle.dumps(binding, pickle.HIGHEST_PROTOCOL)
b'\x80\x04\x95v\x00\x00\x00\x00\x00\x00\x00\x8c+ontology_metadata_api.ontology_metadata_api\x94\x8c\x0eRuleSetBinding\x94\x93\x94)\x81\x94N}\x94(\x8c\r_rule_set_rid\x94\x8c\x08some.rid\x94\x8c\t_bindings\x94}\x94u\x86\x94b.'

What did you want to happen?

FR: Add support for default arguments for list/set query parameters

What happened?

In the Conjure wire spec, it is backwards compatible to add a query parameter of type list<T> or set<T>, since lists are implicitly empty if not provided. Adding a list/set query parameter is not backwards compatible in the generated Python services however, since the parameter will be required on the service method.

What did you want to happen?

Add a flag useQueryParameterDefaultArguments (or make this behavior the default if the generated code changes are entirely backwards compatible) to add a default argument of an empty list/set in the generated service classes for a query parameter of type list<T> or set<T>.

The same should apply for optional query/header parameters.

Python constructor argument order is alphabetical

The generated constructor for a Conjure-defined object currently has its arguments ordered by optional vs. non-optional, followed by alphabetical order. This is defined here.

This seems to be out of sync with generated Java clients for Conjure objects, which have an .of() method whose argument order matches the order in the original Conjure YML definition. Is there a strong reason for this difference between the Java and Python clients?

Union type with name of "property" fails at runtime

What happened?

If I define a union type like so:

MyType:
  union:
    property: TypeA
    otherType: TypeB

When attempting to import this union type, I get a failure traceback like this:

Traceback (most recent call last):
  File "...", line N, in <module>
    from my_package import MyType
  File "...", line N, in <module>
    class MyType(ConjureUnionType):
  File "...", line N, in MyType
    @property
TypeError: 'property' object is not callable

where the failure references the @property annotation on the other_type function in the generated MyType class:

    @property
    def property(self):
        # type: () -> TypeA
        return self._property

--> @property
    def other_type(self):
        # type: () -> TypeB
        return self._other_type

What did you want to happen?

Either generating this union type should fail during Conjure compilation, or there should be some variant of this generated that prevents the issue, such as naming the generated function _property instead.

Force use of keyword arguments in method calls

Method signatures are unstable due to a side effect of the implementation of #14. In order to prevent difficult to debug breaks we should force keyword arguments to be used.

This can be supported out of the box in Python 3:

def fun(*, arg1, arg2):
  pass

But we'll have to get creative for backcompat with Python 2:

def fun(*args, arg1, arg2):
   if args:
     raise ValueError("...")

@ferozco
cc @JacekLach, @jamding

Path parameters are not url encoded

What happened?

This was discovered in the palantir-python-sdk library: palantir/palantir-python-sdk#20

Python classes generated by this library have a bug when a special character is encountered in a path parameter. The example in the above issue is a branch parameter with a '/' character.

What did you want to happen?

Path parameters should be url encoded. It can be done with a simple utility function as such:

def format_path_with_params(path, path_params):
    escaped_path_params = {
        k: requests.utils.quote(v, safe="") for k, v in path_params.items()
    }
    return path.format(**escaped_path_params)

Using the name of a builtin as a property (like "property") breaks the generated code

It generates this:

    @property
    def property(self):
        # type: () -> str
        """Bar foo"""
        return self._property

    @property
    def second_thing(self):
        # type: () -> str
        """Foo bar"""
        return self._second_thing

Which breaks on line 7, when it tries to use the earlier method called property as a decorator.

It should probably import __builtin__ at the start and use @__builtin__.property instead. The same would be true for other builtins.

Union types break service serialization

What happened?

When we upgraded our conjure-python dependency we ran into runtime pyspark serialization issues. We previously could serialize a service object but post-conjure-python upgrade this same service was no longer serializable.

We suspect #320 or #221 broke serde behavior for us.

The pyspark error was:

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 1.0 failed 1 times, most recent failure: Lost task 0.0 in stage 1.0 (TID 1, localhost, executor driver): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/opt/palantir/services/.4229/var/tmp/asset-install/85af169544daf00da129a002813aba21/spark/python/lib/pyspark.zip/pyspark/worker.py", line 413, in main
    func, profiler, deserializer, serializer = read_command(pickleSer, infile)
  File "/opt/palantir/services/.4229/var/tmp/asset-install/85af169544daf00da129a002813aba21/spark/python/lib/pyspark.zip/pyspark/worker.py", line 68, in read_command
    command = serializer._read_with_length(file)
  File "/opt/palantir/services/.4229/var/tmp/asset-install/85af169544daf00da129a002813aba21/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 173, in _read_with_length
    return self.loads(obj)
  File "/opt/palantir/services/.4229/var/tmp/asset-install/85af169544daf00da129a002813aba21/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 697, in loads
    return pickle.loads(obj, encoding=encoding)
AttributeError: type object 'AlertFailureResponse' has no attribute '_service_exception'

This was thrown when passing our service through a map function. This occurred even with zero data passed along. It was only the service code that previously worked.

Other conjure definitions:


      AlertResponse:
        union:
          failureResponse: AlertFailureResponse
          successResponse: AlertSuccessResponse

      AlertFailureResponse:
        fields:
          serviceException: ServiceException
      AlertSuccessResponse:
        fields:
          uuid: uuid

Our __conjure_generator_version__ is 3.12.1.

We mitigated the issue by building our Conjure service in a mapPartitions function which is likely a better practice anyway.

What did you want to happen?

We are not entirely sure on why these new type definitions are not serializable. I believe the fields are renamed in a way that pyspark's serialization cannot find but that is conjecture at this point.

Type comments under generated __init__ functions are out of order

Generated function

def __init__(self, extraction_score, id, property_ids, type):
        # type: (ObjectId, str, List[PropertyId], float) -> None

should be

def __init__(self, extraction_score, id, property_ids, type):
        # type: (float, ObjectId, List[PropertyId], str) -> None

The discrepancy causes mypy validation to fail. I've played around with keyword args and it seems that the only way to get mypy to work with it is to rewrite the generated functions as shown above.

Valid conjure definition results in circular python import

What happened?

I modified the https://github.com/palantir/conjure-java-example to introduce a circular dependency between packages:

--- a/recipe-example-api/src/main/conjure/recipe-example-api.yml
+++ b/recipe-example-api/src/main/conjure/recipe-example-api.yml
@@ -14,6 +14,7 @@ types:
         alias: string

       BakeStep:
+        package: com.palantir.conjure.examples.recipe.api.step
         fields:
           temperature: Temperature
           durationInSeconds: integer

This causes two python packages to be created (expected):
conjure_examples_recipe_api:

from ..conjure_examples_recipe_api_step import BakeStep
from abc import ABCMeta, abstractmethod
from conjure_python_client import ConjureBeanType, ConjureDecoder, ConjureEncoder, ConjureEnumType, ConjureFieldDefinition, ConjureUnionType, ListType, Service
from typing import List, Set

class Recipe(ConjureBeanType):
[...]

conjure_examples_recipe_api_step:

from ..conjure_examples_recipe_api import Temperature
from conjure_python_client import ConjureBeanType, ConjureFieldDefinition

class BakeStep(ConjureBeanType):
[...]

This python code cannot be imported due to the circular dependency:

>>> import sys
>>> sys.path.append("/src/ahiggins/conjure-java-example/recipe-example-api/recipe-example-api-python/python/")
>>> from recipe_example_api.conjure_examples_recipe_api import Temperature

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-428f65a0c05a> in <module>
      1 import sys, os
      2 sys.path.append("/src/ahiggins/conjure-java-example/recipe-example-api/recipe-example-api-python/python/")
----> 3 from recipe_example_api.conjure_examples_recipe_api import Temperature

/src/ahiggins/conjure-java-example/recipe-example-api/recipe-example-api-python/python/recipe_example_api/conjure_examples_recipe_api/__init__.py in <module>
----> 1 from ..conjure_examples_recipe_api_step import BakeStep
      2 from abc import ABCMeta, abstractmethod
      3 from conjure_python_client import ConjureBeanType, ConjureDecoder, ConjureEncoder, ConjureEnumType, ConjureFieldDefinition, ConjureUnionType, ListType, Service
      4 from typing import List, Set
      5 

/src/ahiggins/conjure-java-example/recipe-example-api/recipe-example-api-python/python/recipe_example_api/conjure_examples_recipe_api_step/__init__.py in <module>
----> 1 from ..conjure_examples_recipe_api import Temperature
      2 from conjure_python_client import ConjureBeanType, ConjureFieldDefinition
      3 
      4 class BakeStep(ConjureBeanType):
      5 

ImportError: cannot import name 'Temperature'

Invalid use of keywords as variable names

What happened?

conjure-python 3.13.3

I am consuming a conjure definition similar to this example. It produces invalid python code. The issue is the arg named from which conflicts with the python keyword.

services:
  SomeService:
    endpoints:
      getSomeResults:
        args:
          someRid:
            type: identifiers.SomeRid
            param-type: path
            param-id: someRid
            markers:
              - Safe
          limit:
            docs: |
              Limits the maximum number of results that will be returned in the response.
            type: optional<integer>
            param-type: query
            param-id: limit
            markers:
              - Safe
          from:
            docs: Inclusively filters results based on startTime.
            type: optional<datetime>
            param-type: query
            param-id: before
            markers:
              - Safe
        returns: SomeReturnValue

This produced code similar to the following:

    def get_some_results(self, auth_header, some_rid, from=None, limit=None):
        # type: (str, str, Optional[str], Optional[int]) -> some_api_objects_SomeReturnValue
        """
        Returns a SomeReturnValue for this thing. Results are in descending order by startTime
and contiguous pages can be loaded by using nextPageToken as the argument for before.
        """

        _headers = {
            'Accept': 'application/json',
            'Authorization': auth_header,
        } # type: Dict[str, Any]

        _params = {
            'limit': limit,
            'before': from,
        } # type: Dict[str, Any]

        _path_params = {
            'someRid': some_rid,
        } # type: Dict[str, Any]

        _json = None # type: Any

        _path = '/some/path/{someRid}/stuff'
        _path = _path.format(**_path_params)

        _response = self._request( # type: ignore
            'GET',
            self._uri + _path,
            params=_params,
            headers=_headers,
            json=_json)

        _decoder = ConjureDecoder()
        return _decoder.decode(_response.json(), some_api_objects_SomeReturnValue)

This client library causes compilation errors due to the use of from, a reserved keyword, as a variable name

What did you want to happen?

Ideally the conjure-python generator could handle this case and transform names in the conjure spec in such a way that they do not collide with reserved keywords (e.g. naming the variable from_ or otherwise). The author of the conjure definition should obviously be allowed to be agnostic of this, as it is specific the downstream consumer.

Package names broken in 3.10.0

What happened?

The 3.10.0 release treats package naming and publishing is broken for package names which contain dashes (likely introduced in #46).

E.g:
my-package-name should be normalized my_package_name with submodules underneath.
Instead my-package-name is created and packaged while the submodules are created under my_package_name.

What did you want to happen?

Generate a real Python 'set' for the Conjure set<T> type

What's happening

Given the Conjure definition:

SetExample:
  fields:
    items: set<string>
    doubleItems: set<double>

conjure-python 3.9.0 doesn't actually enforce uniqueness of the items field because it generates a list:

class SetExample(ConjureBeanType):

    @classmethod
    def _fields(cls):
        # type: () -> Dict[str, ConjureFieldDefinition]
        return {
            'items': ConjureFieldDefinition('items', ListType(str)),
            'double_items': ConjureFieldDefinition('doubleItems', ListType(float))
        }

    _items = None # type: List[str]
    _double_items = None # type: List[float]

    def __init__(self, double_items, items):
        # type: (List[float], List[str]) -> None
        self._items = items
        self._double_items = double_items

    @property
    def items(self):
        # type: () -> List[str]
        return self._items

    @property
    def double_items(self):
        # type: () -> List[float]
        return self._double_items

What should happen

We should codegen a python type that actually enforces uniqueness, e.g. set or frozenset: https://docs.python.org/2/library/stdtypes.html#set

Add a header for autogenerated classes

What happened?

This issue is linked to #595. When I discovered an issue with the palantir-python-sdk library, it was pretty much impossible to know that the bug was originating from conjure-python until the person who owns the project told me so.

Additionally, after a bug is fixed in this library, there's currently no way to know if a class generated by this library may be impacted by that bug.

What did you want to happen?

Projects that generate code usually include annotations or a header, so that it's clear how this code is generated (examples that come to mind are jOOQ / Immutables) Ideally, this should include a version number, so that it's easier to read changelogs and understand any potential impact.

Here's what a simple implementation could look like:

'''
This file has been generated by conjure-python version x.y.z
https://github.com/palantir/conjure-python
'''

import ...

class TestService(Service):

Union generator is broken for types that alias to python keywords

What happened?

Union constructor / property accessor write to a different property than the one predeclared:

https://github.com/palantir/conjure-python/blob/develop/conjure-python-core/src/test/resources/types/expected/package_name/product/__init__.py#L723-L797



class UnionTypeExample(ConjureUnionType):
    """A type which can either be a StringExample, a set of strings, or an integer."""
    (...snip...)
    _if = None # type: int
    _new = None # type: int
    _interface = None # type: int


    def __init__(self, string_example=None, set=None, this_field_is_an_integer=None, also_an_integer=None, if_=None, new=None, interface=None):
        (... snip ...)
        if if_ is not None:
            self._if_ = if_
            self._type = 'if'

note self._if_ versus self._if

This means that UnionTypeExample(string_example='foo).if_() throws AttributeError (because _if_ was not set), whereas UnionTypeExample(string_example='foo).set() returns None

What did you want to happen?

The predeclared field in union for special python keywords should match the storage field (i.e. _if_ in this case), or writes should happen to the non-mutated field (_if)

Surface which field is failing in schema validation

When building the conjure object itself, ex:

item = ItemConjureInstance(
       id=id,
       val=val
)

validation works fine and doesn't throw an error,

but in the API definition when validating the output, I'd get an error like:
{"message": "Output type check failed with exception: Expected to find <class 'str'> type but found <class 'int'> instead"}

It doesn't tell me which exact field failed - slowing down debug cycles.

[bug] Generated classes reference types they don't import, breaks mypy checks

What happened?

Just upgraded to 3.10.2 from 3.9.0, mypy checks break due to missing imports from typing

#!/bin/bash -eo pipefail
source conda/bin/activate conda/envs/sundance-entity-extractor/
export MYPYPATH=$(cd stubs/ && pwd)
cd sundance-entity-extractor/service/app/
mypy *.py
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:7: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:51: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:143: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:211: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:247: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:254:64: error: Argument 1 to "OptionalType" has incompatible type "ListType"; expected "Union[Type[int], Type[float], Type[bool], Type[str], Type[ConjureType], Type[List[Any]], Type[Dict[Any, Any]]]"
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:255:60: error: Argument 1 to "OptionalType" has incompatible type "ListType"; expected "Union[Type[int], Type[float], Type[bool], Type[str], Type[ConjureType], Type[List[Any]], Type[Dict[Any, Any]]]"
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:299: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:306:60: error: Argument 1 to "OptionalType" has incompatible type "ListType"; expected "Union[Type[int], Type[float], Type[bool], Type[str], Type[ConjureType], Type[List[Any]], Type[Dict[Any, Any]]]"
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:343: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:379: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:431: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:451: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:479: error: Name 'Dict' is not defined
/home/circleci/project/stubs/net_owl_api/sundance_netowl_api/__init__.py:507: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:11: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:40: error: Name 'Any' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:50:39: error: Invalid base class
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:52: error: Name 'Any' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:57: error: Name 'Any' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:65: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:117: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:137: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:189: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:195:67: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:201: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:204: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:221: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:233: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:285: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:305: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:309:54: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:310:58: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:311:64: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:314: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:315: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:316: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:318: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:324: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:329: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:334: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:341: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:361: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:381: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:401: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:437: error: Name 'Dict' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:444:54: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:445:58: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:446:64: error: Name 'ListType' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:452: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:453: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:454: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:456: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:480: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:485: error: Name 'List' is not defined
/home/circleci/project/stubs/sundance_entity_extractor_api/sundance_entityextractor_api/__init__.py:490: error: Name 'List' is not defined

What did you want to happen?

Generated classes should include everything from typing that they rely on

Query params are not serialized according to the conjure wire spec

What happened?

Attempted to call a service with a conjure-python generated client, where the endpoint defined a query param of type list<string>. The service failed to deserialize the query param because it passed the list raw, i.e., param=[value1, value2]

What did you want to happen?

Generated clients should serialize query params according to the conjure wire spec https://github.com/palantir/conjure/blob/master/docs/spec/wire.md#22-query-parameters so that services deserialize properly, i.e., param=value1&param=value2

Cannot create a field with a single letter name, bad error message if this is intended to be supported

What happened?

I tried to define the following object:

Position:
  fields:
    x: double
    y: double

and it produced a task-failed gradle error, when running with --stacktrace


> Task :project-api:compileConjurePython FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':project-api:compileConjurePython'.
> Failed to run generator. The command '[generate, ...project-api.conjure.json ...]' failed.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':project-api:compileConjurePython'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$3(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:268)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:184)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:173)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:411)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:398)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:391)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:377)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.RuntimeException: Failed to run generator. The command '[...]' failed.
        at com.palantir.gradle.conjure.ConjureRunnerResource$InProcessConjureRunner.invoke(ConjureRunnerResource.java:204)
        at com.palantir.gradle.conjure.GradleExecUtils.exec(GradleExecUtils.java:29)
        at com.palantir.gradle.conjure.ConjureGeneratorTask.lambda$compileFiles$0(ConjureGeneratorTask.java:109)
        at com.palantir.gradle.conjure.ConjureGeneratorTask.compileFiles(ConjureGeneratorTask.java:100)
        at com.palantir.gradle.conjure.ConjureGeneratorTask$1.execute(ConjureGeneratorTask.java:50)
        at com.palantir.gradle.conjure.ConjureGeneratorTask$1.execute(ConjureGeneratorTask.java:47)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:732)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:494)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:479)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:462)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$400(ExecuteActionsTaskExecuter.java:105)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:273)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:251)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$executeOperation$1(ExecuteStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteStep.executeOperation(ExecuteStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:34)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:44)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:34)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:72)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:42)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:53)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:44)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:77)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:58)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:54)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:32)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:57)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:63)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:30)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:176)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:76)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:47)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:39)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:25)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:102)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:95)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:83)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:96)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:52)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:83)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:54)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:88)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:88)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:46)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:34)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:43)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$3.withWorkspace(ExecuteActionsTaskExecuter.java:286)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:43)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:33)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:40)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:30)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:54)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:40)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine.execute(DefaultExecutionEngine.java:41)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:183)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:183)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:173)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:411)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:398)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:391)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:377)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at com.palantir.gradle.conjure.ConjureRunnerResource$InProcessConjureRunner.invoke(ConjureRunnerResource.java:190)
        ... 123 more
Caused by: picocli.CommandLine$ExecutionException: Error while running command (com.palantir.conjure.python.cli.ConjurePythonCli$GenerateCommand@4e315a5d): java.lang.IllegalArgumentException: Unexpected case for: x
        at picocli.CommandLine.executeUserObject(CommandLine.java:1928)
        at picocli.CommandLine.access$1100(CommandLine.java:145)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)
        at picocli.CommandLine$AbstractParseResultHandler.handleParseResult(CommandLine.java:2152)
        at picocli.CommandLine.parseWithHandlers(CommandLine.java:2530)
        at picocli.CommandLine.run(CommandLine.java:2988)
        at picocli.CommandLine.run(CommandLine.java:2925)
        at com.palantir.conjure.python.cli.ConjurePythonCliRedefinedForGradleConjure.main(ConjurePythonCli.java:41)
        ... 127 more
Caused by: java.lang.IllegalArgumentException: Unexpected case for: x
        at com.palantir.conjure.CaseConverter.nameCase(CaseConverter.java:92)
        at com.palantir.conjure.CaseConverter.toCase(CaseConverter.java:83)
        at com.palantir.conjure.python.types.PythonTypeGenerator.lambda$generateBean$3(PythonTypeGenerator.java:108)
        at com.palantir.conjure.python.types.PythonTypeGenerator.generateBean(PythonTypeGenerator.java:117)
        at com.palantir.conjure.python.types.PythonTypeGenerator.access$200(PythonTypeGenerator.java:44)
        at com.palantir.conjure.python.types.PythonTypeGenerator$1.visitObject(PythonTypeGenerator.java:83)
        at com.palantir.conjure.python.types.PythonTypeGenerator$1.visitObject(PythonTypeGenerator.java:70)
        at com.palantir.conjure.spec.TypeDefinition.accept(TypeDefinition.java:53)
        at com.palantir.conjure.python.types.PythonTypeGenerator.generateType(PythonTypeGenerator.java:70)
        at com.palantir.conjure.python.ConjurePythonGenerator.getImplPythonFile(ConjurePythonGenerator.java:152)
        at com.palantir.conjure.python.ConjurePythonGenerator.generate(ConjurePythonGenerator.java:110)
        at com.palantir.conjure.python.ConjurePythonGenerator.write(ConjurePythonGenerator.java:77)
        at com.palantir.conjure.python.cli.ConjurePythonCli$GenerateCommand.run(ConjurePythonCli.java:104)
        at picocli.CommandLine.executeUserObject(CommandLine.java:1919)
        ... 136 more

What did you want to happen?

Either single-letter fields should be supported, or it should error in a more reasonable way.

Unrecognized token 'types': was expecting 'null', 'true', 'false' or NaN

What happened?

When using the the binary in the tgz directly (calling generate on a known good conjure file that I took from foundry-core) I get the following error

Exception in thread "main" picocli.CommandLine$ExecutionException: Error while running command (com.palantir.conjure.python.cli.ConjurePythonCli$GenerateCommand@525f1e4e): java.lang.RuntimeException: Error parsing definition: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'types': was expecting 'null', 'true', 'false' or NaN
 at [Source: (File); line: 1, column: 7]
	at picocli.CommandLine.execute(CommandLine.java:1051)
	at picocli.CommandLine.access$900(CommandLine.java:142)
	at picocli.CommandLine$RunLast.handle(CommandLine.java:1246)
	at picocli.CommandLine$RunLast.handle(CommandLine.java:1214)
	at picocli.CommandLine$AbstractParseResultHandler.handleParseResult(CommandLine.java:1122)
	at picocli.CommandLine.parseWithHandlers(CommandLine.java:1405)
	at picocli.CommandLine.run(CommandLine.java:1864)
	at picocli.CommandLine.run(CommandLine.java:1794)
	at com.palantir.conjure.python.cli.ConjurePythonCli.main(ConjurePythonCli.java:43)
Caused by: java.lang.RuntimeException: Error parsing definition: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'types': was expecting 'null', 'true', 'false' or NaN
 at [Source: (File); line: 1, column: 7]
	at com.palantir.conjure.python.cli.ConjurePythonCli$GenerateCommand.run(ConjurePythonCli.java:108)
	at picocli.CommandLine.execute(CommandLine.java:1043)
	... 8 more

What did you want to happen?

It should've generated bindings.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.