Skip to content

Commit 1350564

Browse files
authored
Merge 4daf290 into 6ea90a6
2 parents 6ea90a6 + 4daf290 commit 1350564

File tree

15 files changed

+440
-339
lines changed

15 files changed

+440
-339
lines changed

generators/src/main/java/com/algolia/codegen/AlgoliaRubyGenerator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.openapitools.codegen.*;
1010
import org.openapitools.codegen.languages.RubyClientCodegen;
1111
import org.openapitools.codegen.model.ModelMap;
12+
import org.openapitools.codegen.model.ModelsMap;
1213
import org.openapitools.codegen.model.OperationsMap;
1314

1415
public class AlgoliaRubyGenerator extends RubyClientCodegen {
@@ -80,6 +81,15 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
8081
return Helpers.specifyCustomRequest(super.fromOperation(path, httpMethod, operation, servers));
8182
}
8283

84+
@Override
85+
public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
86+
Map<String, ModelsMap> models = super.postProcessAllModels(objs);
87+
GenericPropagator.propagateGenericsToModels(models);
88+
OneOf.updateModelsOneOf(models, modelPackage);
89+
OneOf.addOneOfMetadata(models);
90+
return models;
91+
}
92+
8393
@Override
8494
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> models) {
8595
OperationsMap operations = super.postProcessOperationsWithModels(objs, models);

playground/python/app/recommend.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,49 @@
11
from asyncio import run
2+
from os import environ
23

34
from algoliasearch.recommend import __version__
45
from algoliasearch.recommend.client import RecommendClient
6+
from algoliasearch.recommend.models.get_recommendations_params import (
7+
GetRecommendationsParams,
8+
)
9+
from algoliasearch.recommend.models.related_query import RelatedQuery
10+
from algoliasearch.recommend.models.recommendations_request import (
11+
RecommendationsRequest,
12+
)
13+
from algoliasearch.recommend.models.related_model import RelatedModel
14+
15+
from dotenv import load_dotenv
16+
17+
load_dotenv("../.env")
518

619

720
async def main():
821
print("RecommendClient version", __version__)
922

10-
client = RecommendClient("FOO", "BAR")
23+
client = RecommendClient(
24+
environ.get("ALGOLIA_APPLICATION_ID"), environ.get("ALGOLIA_ADMIN_KEY")
25+
)
1126

1227
print("client initialized", client)
1328

1429
try:
15-
response = await client.delete_recommend_rule(
16-
index_name="nvim", model="test", object_id="objID"
30+
response = await client.get_recommendations(
31+
GetRecommendationsParams(
32+
requests=[
33+
RecommendationsRequest(
34+
RelatedQuery(
35+
index_name="cts_e2e_browse",
36+
object_id="Æon Flux",
37+
model=RelatedModel.RELATED_PRODUCTS,
38+
threshold=30,
39+
max_recommendations=2,
40+
)
41+
)
42+
]
43+
)
1744
)
1845

19-
print(response)
46+
print(len(response.results[0].hits), "recommendations found")
2047
finally:
2148
await client.close()
2249

playground/python/poetry.lock

Lines changed: 243 additions & 223 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

playground/ruby/Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: ../../clients/algoliasearch-client-ruby
33
specs:
4-
algolia (3.10.1)
4+
algolia (3.10.2)
55
base64 (>= 0.2.0, < 1)
66
faraday (>= 1.0.1, < 3.0)
77
faraday-net_http_persistent (>= 0.15, < 3)

playground/ruby/recommend.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require 'dotenv'
2+
require 'algolia'
3+
4+
Dotenv.load('../.env')
5+
6+
client = Algolia::RecommendClient.create(ENV['ALGOLIA_APPLICATION_ID'], ENV['ALGOLIA_ADMIN_KEY'])
7+
8+
res = client.get_recommendations(Algolia::Recommend::GetRecommendationsParams.new(
9+
requests: [
10+
Algolia::Recommend::RelatedQuery.new(
11+
index_name: "cts_e2e_browse",
12+
object_id: "Batman Dracula",
13+
model: "related-products",
14+
threshold: 0,
15+
)
16+
]
17+
))
18+
19+
puts res

templates/csharp/modelGeneric.mustache

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,6 @@
88
[ComVisible({{{vendorExtensions.x-com-visible}}})]
99
{{/vendorExtensions.x-com-visible}}
1010
{{^useUnityWebRequest}}
11-
{{#discriminator}}
12-
[JsonConverter(typeof(JsonSubtypes), "{{{discriminatorName}}}")]
13-
{{#mappedModels}}
14-
[JsonSubtypes.KnownSubType(typeof({{{modelName}}}), "{{^vendorExtensions.x-discriminator-value}}{{{mappingName}}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{.}}}{{/vendorExtensions.x-discriminator-value}}")]
15-
{{/mappedModels}}
16-
{{/discriminator}}
1711
{{/useUnityWebRequest}}
1812
{{> visibility}} partial class {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}}
1913
{

templates/go/model_anyof.mustache

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,6 @@ func (dst *{{classname}}) UnmarshalJSON(data []byte) error {
1515
}
1616

1717
{{/isNullable}}
18-
{{#discriminator}}
19-
{{#mappedModels}}
20-
{{#-first}}
21-
// use discriminator value to speed up the lookup
22-
var jsonDict map[string]any
23-
err = json.Unmarshal(data, &jsonDict)
24-
if err != nil {
25-
return fmt.Errorf("Failed to unmarshal JSON into map for the discriminator lookup.")
26-
}
27-
28-
{{/-first}}
29-
// check if the discriminator value is '{{{mappingName}}}'
30-
if jsonDict["{{{propertyBaseName}}}"] == "{{{mappingName}}}" {
31-
// try to unmarshal JSON data into {{{modelName}}}
32-
err = json.Unmarshal(data, &dst.{{{modelName}}});
33-
if err == nil {
34-
json{{{modelName}}}, _ := json.Marshal(dst.{{{modelName}}})
35-
if string(json{{{modelName}}}) == "{}" { // empty struct
36-
dst.{{{modelName}}} = nil
37-
} else {
38-
return nil // data stored in dst.{{{modelName}}}, return on the first match
39-
}
40-
} else {
41-
dst.{{{modelName}}} = nil
42-
}
43-
}
44-
45-
{{/mappedModels}}
46-
{{/discriminator}}
4718
{{#anyOf}}
4819
// try to unmarshal JSON data into {{{.}}}
4920
err = json.Unmarshal(data, &dst.{{{.}}});

templates/java/pojo.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorE
2727
private {{> generic_type}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}};
2828
{{/isContainer}}
2929
{{^isContainer}}
30-
{{#isDiscriminator}}protected{{/isDiscriminator}}{{^isDiscriminator}}private{{/isDiscriminator}} {{{datatypeWithEnum}}} {{name}};
30+
private {{{datatypeWithEnum}}} {{name}};
3131
{{/isContainer}}
3232

3333
{{/vars}}

templates/php/tests/requests/requests.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class {{clientPrefix}}Test extends TestCase implements HttpClientInterface
3535
3636
if (isset($request['body'])) {
3737
$this->assertEquals(
38-
json_encode($request['body']),
38+
json_encode($request['body'], JSON_UNESCAPED_UNICODE),
3939
$recordedRequest->getBody()->getContents()
4040
);
4141
}

templates/ruby/partial_anyof_module.mustache

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242

4343
SchemaMismatchError = Class.new(StandardError)
4444

45-
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
4645
def find_and_cast_into_type(klass, data)
4746
return if data.nil?
4847

@@ -77,12 +76,16 @@
7776
if const.respond_to?(:openapi_any_of) # nested anyOf model
7877
model = const.build(data)
7978
return model if model
79+
elsif const.respond_to?(:discriminator_attributes)
80+
if const.discriminator_attributes().all? { |attr| data.key?(attr) }
81+
model = const.build_from_hash(data)
82+
end
8083
else
81-
# raise if data contains keys that are not known to the model
82-
raise unless (data.keys - const.acceptable_attributes).empty?
84+
# maybe it's an enum, or doens't have discriminators
8385
model = const.build_from_hash(data)
84-
return model if model
8586
end
87+
88+
return model if model
8689
end
8790
end
8891

templates/ruby/partial_model_generic.mustache

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@
2222
}
2323
end
2424

25-
# Returns all the JSON keys this model knows about{{#parent}}, including the ones defined in its parent(s){{/parent}}
26-
def self.acceptable_attributes
27-
{{^parent}}
28-
attribute_map.values
29-
{{/parent}}
30-
{{#parent}}
31-
attribute_map.values.concat(superclass.acceptable_attributes)
32-
{{/parent}}
25+
{{#vendorExtensions.x-discriminator-fields.size}}
26+
# Returns the keys that uniquely identify this oneOf variant when present
27+
def self.discriminator_attributes
28+
[
29+
{{#vendorExtensions.x-discriminator-fields}}
30+
:{{.}}{{^-last}},{{/-last}}
31+
{{/vendorExtensions.x-discriminator-fields}}
32+
]
3333
end
34+
{{/vendorExtensions.x-discriminator-fields.size}}
3435

3536
# Attribute type mapping.
3637
def self.types_mapping
@@ -78,15 +79,6 @@
7879

7980
{{/-last}}
8081
{{/allOf}}
81-
{{#discriminator}}
82-
{{#propertyName}}
83-
# discriminator's property name in OpenAPI v3
84-
def self.openapi_discriminator_name
85-
:'{{{.}}}'
86-
end
87-
88-
{{/propertyName}}
89-
{{/discriminator}}
9082
# Initializes the object
9183
# @param [Hash] attributes Model attributes in the form of hash
9284
def initialize(attributes = {})

templates/ruby/partial_oneof_module.mustache

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,49 +16,10 @@
1616

1717
{{/-last}}
1818
{{/oneOf}}
19-
{{#discriminator}}
20-
{{#propertyName}}
21-
# Discriminator's property name (OpenAPI v3)
22-
def openapi_discriminator_name
23-
:'{{{.}}}'
24-
end
25-
26-
{{/propertyName}}
27-
{{#mappedModels}}
28-
{{#-first}}
29-
# Discriminator's mapping (OpenAPI v3)
30-
def openapi_discriminator_mapping
31-
{
32-
{{/-first}}
33-
:{{{mappingName}}} => :'{{{modelName}}}'{{^-last}},{{/-last}}
34-
{{#-last}}
35-
}
36-
end
37-
38-
{{/-last}}
39-
{{/mappedModels}}
40-
{{/discriminator}}
4119
# Builds the object
4220
# @param [Mixed] Data to be matched against the list of oneOf items
4321
# @return [Object] Returns the model or the data itself
4422
def build(data)
45-
{{#discriminator}}
46-
discriminator_value = data[openapi_discriminator_name]
47-
return nil if discriminator_value.nil?
48-
{{#mappedModels}}
49-
{{#-first}}
50-
51-
klass = openapi_discriminator_mapping[discriminator_value.to_s.to_sym]
52-
return nil unless klass
53-
54-
{{moduleName}}::{{modelModule}}.const_get(klass).build_from_hash(data)
55-
{{/-first}}
56-
{{/mappedModels}}
57-
{{^mappedModels}}
58-
{{moduleName}}::{{modelModule}}.const_get(discriminator_value).build_from_hash(data)
59-
{{/mappedModels}}
60-
{{/discriminator}}
61-
{{^discriminator}}
6223
# Go through the list of oneOf items and attempt to identify the appropriate one.
6324
# Note:
6425
# - We do not attempt to check whether exactly one item matches.
@@ -76,15 +37,12 @@
7637
end
7738

7839
openapi_one_of.include?(:AnyType) ? data : nil
79-
{{/discriminator}}
8040
end
81-
{{^discriminator}}
8241

8342
private
8443

8544
SchemaMismatchError = Class.new(StandardError)
8645

87-
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
8846
def find_and_cast_into_type(klass, data)
8947
return if data.nil?
9048

@@ -119,12 +77,12 @@
11977
if const.respond_to?(:openapi_one_of)
12078
# nested oneOf model
12179
model = const.build(data)
122-
elsif const.respond_to?(:acceptable_attributes)
123-
# raise if data contains keys that are not known to the model
124-
raise unless (data.keys - const.acceptable_attributes).empty?
125-
model = const.build_from_hash(data)
80+
elsif const.respond_to?(:discriminator_attributes)
81+
if const.discriminator_attributes().all? { |attr| data.key?(attr) }
82+
model = const.build_from_hash(data)
83+
end
12684
else
127-
# maybe it's an enum
85+
# maybe it's an enum, or doens't have discriminators
12886
model = const.build_from_hash(data)
12987
end
13088

@@ -136,6 +94,5 @@
13694
rescue
13795
raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
13896
end
139-
{{/discriminator}}
14097
end
14198
end

templates/scala/oneof_trait.mustache

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ object {{classname}}Serializer extends Serializer[{{classname}}] {
9191
{{#isModel}}
9292
case value: JObject {{#vendorExtensions.x-discriminator-fields}}{{#-first}}if{{/-first}}{{^-first}}&&{{/-first}} value.obj.exists(_._1 == "{{{.}}}"){{/vendorExtensions.x-discriminator-fields}} => Extraction.extract[{{{datatypeWithEnum}}}](value)
9393
{{/isModel}}
94+
{{^isModel}}
95+
{{^isEnumRef}}
96+
{{#vendorExtensions.x-discriminator-fields.size}}
97+
case value: JObject {{#vendorExtensions.x-discriminator-fields}}{{#-first}}if{{/-first}}{{^-first}}&&{{/-first}} value.obj.exists(_._1 == "{{{.}}}"){{/vendorExtensions.x-discriminator-fields}} => Extraction.extract[{{{datatypeWithEnum}}}](value)
98+
{{/vendorExtensions.x-discriminator-fields.size}}
99+
{{/isEnumRef}}
100+
{{/isModel}}
94101
{{#isMap}}
95102
case value: JObject => {{classname}}.apply(Extraction.extract[{{{datatypeWithEnum}}}](value))
96103
{{/isMap}}

0 commit comments

Comments
 (0)