palantir / conjure-python Goto Github PK
View Code? Open in Web Editor NEWConjure generator for Python clients
License: Apache License 2.0
Conjure generator for Python clients
License: Apache License 2.0
#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.'
conjure-python will happily generate
def foo(self):
# type: () -> Optional[str]
"""Foo: returns the string "bar""""
...
when given the doc string of Foo: returns the string "bar"
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.
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.
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?
Service files do not import ListType
from conjure_python_client
, resulting in a NameError
when the response type is set
(and possibly list
, but I hit this on a set
).
NameError: name 'ListType' is not defined
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
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.
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("...")
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.
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)
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.
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.
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.
By default, Python uses a dict to store the fields of a class. This allows for fields to be dynamically added to an object at the cost of runtime performance and memory usage.
We can avoid the runtime costs by definin __slots__
in our objects. This tells Python to only allocate enough space for the predefined set of fields.
Links:
https://blog.usejournal.com/a-quick-dive-into-pythons-slots-72cdc2d334e
http://book.pythontips.com/en/latest/__slots__magic.html
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.
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'
Generated aliases in python are sorted alphabetically, which might fail to compile if aliases reference each other in a topological manner
Might need to implement a topological sort of aliases
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
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.
Merging #16 early to unblock urgent consumers.
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
.
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
We should codegen a python type that actually enforces uniqueness, e.g. set
or frozenset
: https://docs.python.org/2/library/stdtypes.html#set
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.
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 constructor / property accessor write to a different property than the one predeclared:
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
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
)
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.
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
Generated classes should include everything from typing that they rely on
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]
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¶m=value2
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
Either single-letter fields should be supported, or it should error in a more reasonable way.
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
It should've generated bindings.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.