schemable 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|