schemable 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +3 -1
- data/lib/schemable/configuration.rb +2 -0
- data/lib/schemable/definition.rb +12 -0
- data/lib/schemable/relationship_schema_generator.rb +37 -30
- data/lib/schemable/response_schema_generator.rb +7 -3
- data/lib/schemable/version.rb +1 -1
- data/lib/templates/schemable.rb +5 -0
- data/sig/schemable/configuration.rbs +1 -0
- data/sig/schemable/definition.rbs +1 -0
- data/sig/schemable/response_schema_generator.rbs +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76b5ccf66c28d0bcfc644321e370e1c4404518ee1a4ba056fe20bb72a22cc415
|
4
|
+
data.tar.gz: cd7ad60e43634159a2b845c15ef557a3a60b02cb5c465e63e5f90ff47807afe5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 835b1048ab2efd7419b45e77d4733e769d9c657a5cd08e67a26584f3cf6f3ca23588d7875eb21353d9a283f422b50bb50bfc8a5ef0dd2edcad3dcf0c76cfda16
|
7
|
+
data.tar.gz: accc7a59d075dfc07437f7d2c6bfa8367336b3aafd8d04aca652c38a98cebdf3e7f80c614c1e90524091df6f32e7306ac4f2d183ab79157863f4014376a3b14a
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
This file is used to list changes made in each version of the Schemable gem.
|
3
3
|
|
4
|
+
## Schemable 1.0.3 (2024-01-30)
|
5
|
+
|
6
|
+
* Added configuration for preventing expansion for nested relationships. This can be done by setting the `expand_nested` to `true` when invoking `ResponseSchemaGenerator`'s `generate` instance method (e.g. `ResponseSchemaGenerator.new(instance).generate(expand: true, expand_nested: true)`. Additionally, you could globally set the value of `expand_nested` to the same value as `expand` by setting the configuration `infer_expand_nested_from_expand` to `true` in the `/config/initializers/schemable.rb`.
|
7
|
+
|
8
|
+
## Schemable 1.0.2 (2024-01-30)
|
9
|
+
|
10
|
+
* Added configuration for making certain associations nullable in the response's relationship. This can be done by adding the name of the relation in the `nullable_relationships` method's array of strings.
|
11
|
+
|
4
12
|
## Schemable 1.0.1 (2024-01-29)
|
5
13
|
|
6
14
|
* Added configuration for changing the default value of enums. By default first key is used, or alternatively default can be set manually by the method `default_value_for_enum_attributes` from the definition.
|
data/README.md
CHANGED
@@ -61,6 +61,7 @@ Please note that the configurations options below are defined in the `Schemable`
|
|
61
61
|
| `enum_prefix_for_simple_enum` | The prefix to be used for the enum values when `mongoid` is used. | `nil` |
|
62
62
|
| `enum_suffix_for_simple_enum` | The suffix to be used for the enum values when `mongoid` is used. | `nil` |
|
63
63
|
| `infer_attributes_from_custom_method` | The name of the custom method that is used to get the attributes to be generated in the schema. See [Annex 1.3 - Infer attributes from custom method](#annex-13---infer-attributes-from-custom-method) for more information. | `nil` |
|
64
|
+
| `infer_expand_nested_from_expand` | Configures `ResponseSchemaGenerator`'s `generate` method to prevent expansion for nested relationships. It globally set the value of `expand_nested` to the same value as `expand` by setting the configuration to `true` | `flase` |
|
64
65
|
| `infer_attributes_from_jsonapi_serializable` | Whether or not to infer the attributes from the `JSONAPI::Serializable::Resource` class. See the previous example [Annex 1.1 - Use serialized instance](#annex-11---use-serialized-instance) for more information. | `false` |
|
65
66
|
| `custom_meta_response_schema` | A hash of custom meta response schema that can be used to override the default meta response schema. See [Annex 1.4 - Custom meta response schema](#annex-14---custom-meta-response-schema) for more information. | `nil` |
|
66
67
|
| `pagination_enabled` | Enable pagination schema generation in the `meta` section of the response schema. | `true` |
|
@@ -86,6 +87,7 @@ The following is a list of the methods that can be overridden. (See the example
|
|
86
87
|
| `optional_create_request_attributes` | Returns the attributes that are not required in the create request. |
|
87
88
|
| `optional_update_request_attributes` | Returns the attributes that are not required in the update request. |
|
88
89
|
| `nullable_attributes` | Returns the attributes that are nullable in the request/response body. |
|
90
|
+
| `nullable_relationships` | Returns the relationships that are nullable in the response body. |
|
89
91
|
| `additional_create_request_attributes` | Returns the additional create request attributes that are not automatically generated. |
|
90
92
|
| `additional_update_request_attributes` | Returns the additional update request attributes that are not automatically generated. |
|
91
93
|
| `additional_response_attributes` | Returns the additional response attributes that are not automatically generated. |
|
@@ -399,7 +401,7 @@ module Swagger
|
|
399
401
|
"#{schema_instance.model}CreateRequest": schema_instance.camelize_keys(Schemable::RequestSchemaGenerator.new(schema_instance).generate_for_create),
|
400
402
|
"#{schema_instance.model}UpdateRequest": schema_instance.camelize_keys(Schemable::RequestSchemaGenerator.new(schema_instance).generate_for_update),
|
401
403
|
"#{schema_instance.model}Response": schema_instance.camelize_keys(Schemable::ResponseSchemaGenerator.new(schema_instance).generate(expand: true, collection: true, relationships_to_exclude_from_expansion: %w[addresses stores attachments])),
|
402
|
-
"#{schema_instance.model}ResponseExpanded": schema_instance.camelize_keys(Schemable::ResponseSchemaGenerator.new(schema_instance).generate(expand: true))
|
404
|
+
"#{schema_instance.model}ResponseExpanded": schema_instance.camelize_keys(Schemable::ResponseSchemaGenerator.new(schema_instance).generate(expand: true, expand_nested: true))
|
403
405
|
]
|
404
406
|
end
|
405
407
|
end
|
@@ -16,6 +16,7 @@ module Schemable
|
|
16
16
|
:enum_prefix_for_simple_enum,
|
17
17
|
:enum_suffix_for_simple_enum,
|
18
18
|
:custom_meta_response_schema,
|
19
|
+
:infer_expand_nested_from_expand,
|
19
20
|
:infer_attributes_from_custom_method,
|
20
21
|
:infer_attributes_from_jsonapi_serializable
|
21
22
|
)
|
@@ -32,6 +33,7 @@ module Schemable
|
|
32
33
|
@custom_meta_response_schema = nil
|
33
34
|
@enum_prefix_for_simple_enum = nil
|
34
35
|
@enum_suffix_for_simple_enum = nil
|
36
|
+
@infer_expand_nested_from_expand = false
|
35
37
|
@infer_attributes_from_custom_method = nil
|
36
38
|
@infer_attributes_from_jsonapi_serializable = false
|
37
39
|
end
|
data/lib/schemable/definition.rb
CHANGED
@@ -125,6 +125,18 @@ module Schemable
|
|
125
125
|
%i[]
|
126
126
|
end
|
127
127
|
|
128
|
+
# Returns the relationships that are nullable in the response body.
|
129
|
+
# This means that they can be present in the response body but they can be null.
|
130
|
+
# They are not required to be present in the request body.
|
131
|
+
#
|
132
|
+
# @example
|
133
|
+
# ['users', 'applicant']
|
134
|
+
#
|
135
|
+
# @return [Array<String>] The attributes that are nullable in the response body.
|
136
|
+
def nullable_relationships
|
137
|
+
%w[]
|
138
|
+
end
|
139
|
+
|
128
140
|
# Returns the additional create request attributes that are not automatically generated.
|
129
141
|
# These attributes are appended to the create request schema.
|
130
142
|
#
|
@@ -84,36 +84,43 @@ module Schemable
|
|
84
84
|
#
|
85
85
|
# @return [Hash] The generated schema for the relationship.
|
86
86
|
def generate_schema(type_name, collection: false)
|
87
|
-
if collection
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
87
|
+
schema = if collection
|
88
|
+
{
|
89
|
+
type: :object,
|
90
|
+
properties: {
|
91
|
+
data: {
|
92
|
+
type: :array,
|
93
|
+
items: {
|
94
|
+
type: :object,
|
95
|
+
properties: {
|
96
|
+
id: { type: :string },
|
97
|
+
type: { type: :string, default: type_name }
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
else
|
104
|
+
{
|
105
|
+
type: :object,
|
106
|
+
properties: {
|
107
|
+
data: {
|
108
|
+
type: :object,
|
109
|
+
properties: {
|
110
|
+
id: { type: :string },
|
111
|
+
type: { type: :string, default: type_name }
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
# Modify the schema to nullable if the relationship is in nullable
|
119
|
+
is_relation_nullable = @model_definition.nullable_relationships.include?(type_name)
|
120
|
+
|
121
|
+
return schema unless is_relation_nullable
|
122
|
+
|
123
|
+
@schema_modifier.add_properties(schema, { nullable: true }, 'properties.data')
|
117
124
|
end
|
118
125
|
end
|
119
126
|
end
|
@@ -27,12 +27,16 @@ module Schemable
|
|
27
27
|
# @param expand [Boolean] Whether to include the included resources in the schema.
|
28
28
|
# @param relationships_to_exclude_from_expansion [Array] The relationships to exclude from expansion in the schema.
|
29
29
|
# @param collection [Boolean] Whether the response is for a collection of resources.
|
30
|
+
# @param expand_nested [Boolean] Whether to include the nested relationships in the schema.
|
30
31
|
#
|
31
32
|
# @example
|
32
|
-
# schema = generator.generate(expand: true, relationships_to_exclude_from_expansion: ['some_relationship'], collection: true)
|
33
|
+
# schema = generator.generate(expand: true, relationships_to_exclude_from_expansion: ['some_relationship'], collection: true, expand_nested: true)
|
33
34
|
#
|
34
35
|
# @return [Hash] The generated schema.
|
35
|
-
def generate(expand: false, relationships_to_exclude_from_expansion: [], collection: false)
|
36
|
+
def generate(expand: false, relationships_to_exclude_from_expansion: [], collection: false, expand_nested: false)
|
37
|
+
# Override expand_nested if infer_expand_nested_from_expand is true
|
38
|
+
expand_nested = expand if @configuration.infer_expand_nested_from_expand
|
39
|
+
|
36
40
|
data = {
|
37
41
|
type: :object,
|
38
42
|
properties: {
|
@@ -51,7 +55,7 @@ module Schemable
|
|
51
55
|
schema = collection ? { data: { type: :array, items: data } } : { data: }
|
52
56
|
|
53
57
|
if expand
|
54
|
-
included_schema = IncludedSchemaGenerator.new(@model_definition).generate(expand
|
58
|
+
included_schema = IncludedSchemaGenerator.new(@model_definition).generate(expand: expand_nested, relationships_to_exclude_from_expansion:)
|
55
59
|
@schema_modifier.add_properties(schema, included_schema, '.')
|
56
60
|
end
|
57
61
|
|
data/lib/schemable/version.rb
CHANGED
data/lib/templates/schemable.rb
CHANGED
@@ -41,6 +41,11 @@ Schemable.configure do |config|
|
|
41
41
|
#
|
42
42
|
# config.infer_attributes_from_custom_method = nil
|
43
43
|
|
44
|
+
# If you want to recursively expand the relationships in the response schema
|
45
|
+
# then set this option to true, otherwise set it to false (default).
|
46
|
+
#
|
47
|
+
# config.infer_expand_nested_from_expand = true
|
48
|
+
|
44
49
|
# If you want to get the list of attributes from the jsonapi-rails gem's
|
45
50
|
# JSONAPI::Serializable::Resource class, set this option to true.
|
46
51
|
# It uses the attribute_blocks method to get the list of attributes.
|
@@ -8,6 +8,7 @@ module Schemable
|
|
8
8
|
attr_accessor custom_defined_enum_method: Symbol?
|
9
9
|
attr_accessor enum_prefix_for_simple_enum: String?
|
10
10
|
attr_accessor enum_suffix_for_simple_enum: String?
|
11
|
+
attr_accessor infer_expand_nested_from_expand: bool
|
11
12
|
attr_accessor custom_type_mappers: Hash[Symbol, any]
|
12
13
|
attr_accessor infer_attributes_from_custom_method: Symbol?
|
13
14
|
attr_accessor custom_meta_response_schema: Hash[Symbol, any]?
|
@@ -13,6 +13,7 @@ module Schemable
|
|
13
13
|
def array_types: -> Hash[Symbol, any]
|
14
14
|
def relationships: -> Hash[Symbol, any]
|
15
15
|
def nullable_attributes: -> Array[Symbol]
|
16
|
+
def nullable_relationships: -> Array[String]
|
16
17
|
def serialized_instance: -> Hash[Symbol, any]
|
17
18
|
def self.generate: -> Array[Hash[Symbol, any]]
|
18
19
|
def excluded_response_included: -> Array[Symbol]
|
@@ -8,6 +8,6 @@ module Schemable
|
|
8
8
|
def initialize: (Definition) -> void
|
9
9
|
def meta: -> Hash[Symbol, any]
|
10
10
|
def jsonapi: -> Hash[Symbol, any]
|
11
|
-
def generate: (expand: bool, relationships_to_exclude_from_expansion: Array[Symbol], collection: bool) -> Hash[Symbol, any]
|
11
|
+
def generate: (expand: bool, relationships_to_exclude_from_expansion: Array[Symbol], collection: bool, expand_nested: bool) -> Hash[Symbol, any]
|
12
12
|
end
|
13
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schemable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Muhammad Nawzad
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The schemable gem is an opinionated Gem for Rails applications to auto
|
14
14
|
generate schema for models in JSONAPI format. It is designed to work with rswag's
|