jsapi 0.1.1

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.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jsapi/controller/base.rb +21 -0
  3. data/lib/jsapi/controller/error_result.rb +21 -0
  4. data/lib/jsapi/controller/methods.rb +144 -0
  5. data/lib/jsapi/controller/parameters.rb +86 -0
  6. data/lib/jsapi/controller/parameters_invalid.rb +25 -0
  7. data/lib/jsapi/controller/response.rb +84 -0
  8. data/lib/jsapi/controller.rb +13 -0
  9. data/lib/jsapi/dsl/callbacks.rb +32 -0
  10. data/lib/jsapi/dsl/class_methods.rb +85 -0
  11. data/lib/jsapi/dsl/definitions.rb +102 -0
  12. data/lib/jsapi/dsl/error.rb +38 -0
  13. data/lib/jsapi/dsl/examples.rb +30 -0
  14. data/lib/jsapi/dsl/node.rb +62 -0
  15. data/lib/jsapi/dsl/openapi/callback.rb +23 -0
  16. data/lib/jsapi/dsl/openapi/root.rb +12 -0
  17. data/lib/jsapi/dsl/openapi.rb +4 -0
  18. data/lib/jsapi/dsl/operation.rb +118 -0
  19. data/lib/jsapi/dsl/parameter.rb +10 -0
  20. data/lib/jsapi/dsl/request_body.rb +10 -0
  21. data/lib/jsapi/dsl/response.rb +33 -0
  22. data/lib/jsapi/dsl/schema.rb +87 -0
  23. data/lib/jsapi/dsl.rb +24 -0
  24. data/lib/jsapi/json/array.rb +35 -0
  25. data/lib/jsapi/json/boolean.rb +17 -0
  26. data/lib/jsapi/json/integer.rb +15 -0
  27. data/lib/jsapi/json/null.rb +27 -0
  28. data/lib/jsapi/json/number.rb +15 -0
  29. data/lib/jsapi/json/object.rb +53 -0
  30. data/lib/jsapi/json/string.rb +29 -0
  31. data/lib/jsapi/json/value.rb +47 -0
  32. data/lib/jsapi/json.rb +41 -0
  33. data/lib/jsapi/meta/attributes/class_methods.rb +112 -0
  34. data/lib/jsapi/meta/attributes/type_caster.rb +48 -0
  35. data/lib/jsapi/meta/attributes.rb +4 -0
  36. data/lib/jsapi/meta/base.rb +41 -0
  37. data/lib/jsapi/meta/base_reference.rb +33 -0
  38. data/lib/jsapi/meta/definitions.rb +226 -0
  39. data/lib/jsapi/meta/example/model.rb +44 -0
  40. data/lib/jsapi/meta/example/reference.rb +15 -0
  41. data/lib/jsapi/meta/example.rb +19 -0
  42. data/lib/jsapi/meta/existence.rb +69 -0
  43. data/lib/jsapi/meta/invalid_argument_error.rb +11 -0
  44. data/lib/jsapi/meta/openapi/callback/model.rb +36 -0
  45. data/lib/jsapi/meta/openapi/callback/reference.rb +16 -0
  46. data/lib/jsapi/meta/openapi/callback.rb +21 -0
  47. data/lib/jsapi/meta/openapi/contact.rb +34 -0
  48. data/lib/jsapi/meta/openapi/external_documentation.rb +28 -0
  49. data/lib/jsapi/meta/openapi/info.rb +52 -0
  50. data/lib/jsapi/meta/openapi/license.rb +28 -0
  51. data/lib/jsapi/meta/openapi/link/model.rb +48 -0
  52. data/lib/jsapi/meta/openapi/link/reference.rb +16 -0
  53. data/lib/jsapi/meta/openapi/link.rb +21 -0
  54. data/lib/jsapi/meta/openapi/oauth_flow.rb +50 -0
  55. data/lib/jsapi/meta/openapi/root.rb +134 -0
  56. data/lib/jsapi/meta/openapi/security_requirement.rb +27 -0
  57. data/lib/jsapi/meta/openapi/security_scheme/api_key.rb +38 -0
  58. data/lib/jsapi/meta/openapi/security_scheme/base.rb +16 -0
  59. data/lib/jsapi/meta/openapi/security_scheme/http/basic.rb +31 -0
  60. data/lib/jsapi/meta/openapi/security_scheme/http/bearer.rb +37 -0
  61. data/lib/jsapi/meta/openapi/security_scheme/http/other.rb +37 -0
  62. data/lib/jsapi/meta/openapi/security_scheme/http.rb +31 -0
  63. data/lib/jsapi/meta/openapi/security_scheme/oauth2.rb +47 -0
  64. data/lib/jsapi/meta/openapi/security_scheme/open_id_connect.rb +33 -0
  65. data/lib/jsapi/meta/openapi/security_scheme.rb +51 -0
  66. data/lib/jsapi/meta/openapi/server.rb +34 -0
  67. data/lib/jsapi/meta/openapi/server_variable.rb +34 -0
  68. data/lib/jsapi/meta/openapi/tag.rb +34 -0
  69. data/lib/jsapi/meta/openapi/version.rb +41 -0
  70. data/lib/jsapi/meta/openapi.rb +16 -0
  71. data/lib/jsapi/meta/operation.rb +186 -0
  72. data/lib/jsapi/meta/parameter/model.rb +170 -0
  73. data/lib/jsapi/meta/parameter/reference.rb +30 -0
  74. data/lib/jsapi/meta/parameter.rb +19 -0
  75. data/lib/jsapi/meta/property.rb +62 -0
  76. data/lib/jsapi/meta/reference_error.rb +12 -0
  77. data/lib/jsapi/meta/request_body/model.rb +65 -0
  78. data/lib/jsapi/meta/request_body/reference.rb +14 -0
  79. data/lib/jsapi/meta/request_body.rb +19 -0
  80. data/lib/jsapi/meta/rescue_handler.rb +26 -0
  81. data/lib/jsapi/meta/response/model.rb +72 -0
  82. data/lib/jsapi/meta/response/reference.rb +17 -0
  83. data/lib/jsapi/meta/response.rb +19 -0
  84. data/lib/jsapi/meta/schema/array.rb +42 -0
  85. data/lib/jsapi/meta/schema/base.rb +146 -0
  86. data/lib/jsapi/meta/schema/boolean.rb +9 -0
  87. data/lib/jsapi/meta/schema/boundary.rb +37 -0
  88. data/lib/jsapi/meta/schema/conversion.rb +28 -0
  89. data/lib/jsapi/meta/schema/delegator.rb +26 -0
  90. data/lib/jsapi/meta/schema/discriminator.rb +36 -0
  91. data/lib/jsapi/meta/schema/integer.rb +9 -0
  92. data/lib/jsapi/meta/schema/number.rb +9 -0
  93. data/lib/jsapi/meta/schema/numeric.rb +56 -0
  94. data/lib/jsapi/meta/schema/object.rb +85 -0
  95. data/lib/jsapi/meta/schema/reference.rb +38 -0
  96. data/lib/jsapi/meta/schema/string.rb +58 -0
  97. data/lib/jsapi/meta/schema/validation/base.rb +29 -0
  98. data/lib/jsapi/meta/schema/validation/enum.rb +26 -0
  99. data/lib/jsapi/meta/schema/validation/max_items.rb +26 -0
  100. data/lib/jsapi/meta/schema/validation/max_length.rb +26 -0
  101. data/lib/jsapi/meta/schema/validation/maximum.rb +51 -0
  102. data/lib/jsapi/meta/schema/validation/min_items.rb +26 -0
  103. data/lib/jsapi/meta/schema/validation/min_length.rb +26 -0
  104. data/lib/jsapi/meta/schema/validation/minimum.rb +51 -0
  105. data/lib/jsapi/meta/schema/validation/multiple_of.rb +24 -0
  106. data/lib/jsapi/meta/schema/validation/pattern.rb +30 -0
  107. data/lib/jsapi/meta/schema/validation.rb +12 -0
  108. data/lib/jsapi/meta/schema.rb +61 -0
  109. data/lib/jsapi/meta.rb +23 -0
  110. data/lib/jsapi/model/attributes.rb +22 -0
  111. data/lib/jsapi/model/base.rb +34 -0
  112. data/lib/jsapi/model/error.rb +15 -0
  113. data/lib/jsapi/model/errors.rb +51 -0
  114. data/lib/jsapi/model/naming.rb +28 -0
  115. data/lib/jsapi/model/nestable.rb +37 -0
  116. data/lib/jsapi/model/nested_error.rb +54 -0
  117. data/lib/jsapi/model/validations.rb +27 -0
  118. data/lib/jsapi/model.rb +15 -0
  119. data/lib/jsapi/version.rb +8 -0
  120. data/lib/jsapi.rb +8 -0
  121. metadata +162 -0
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ # The base API model used to represent top-level parameters and nested
6
+ # object parameters by default.
7
+ class Base
8
+ extend Naming
9
+
10
+ include Attributes
11
+ include Validations
12
+
13
+ def initialize(nested)
14
+ @nested = nested
15
+ end
16
+
17
+ def ==(other) # :nodoc:
18
+ super || (
19
+ self.class == other.class &&
20
+ attributes == other.attributes
21
+ )
22
+ end
23
+
24
+ def inspect # :nodoc:
25
+ "#<#{self.class.name} " \
26
+ "#{attributes.map { |k, v| "#{k}: #{v.inspect}" }.join(', ')}>"
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :nested
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ class Error < ActiveModel::Error
6
+
7
+ # Overrides <code>ActiveModel::Error#full_message</code>.
8
+ def full_message
9
+ return message if attribute == :base || attribute.blank?
10
+
11
+ "'#{attribute}' #{message}".rstrip
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ class Errors < ActiveModel::Errors
6
+ def initialize(base = nil)
7
+ @base = base
8
+ @path = []
9
+ super
10
+ end
11
+
12
+ # Overrides <code>ActiveModel::Errors#add</code> to wrap errors related
13
+ # to nested models.
14
+ def add(attribute, type = :invalid, **options)
15
+ type = type.call(@base, options) if type.respond_to?(:call)
16
+
17
+ errors << wrap(Error.new(@base, attribute.to_sym, type, **options))
18
+ end
19
+
20
+ # Overrides <code>ActiveModel::Errors#import</code> to wrap errors
21
+ # related to nested models.
22
+ def import(error, options = {})
23
+ if (options = options.slice(:attribute, :type)).any?
24
+ attribute = (options[:attribute] || error.attribute).to_sym
25
+ type = options[:type] || error.raw_type
26
+ error = Error.new(error.base, attribute, type, **error.options)
27
+ end
28
+ errors << wrap(error)
29
+ end
30
+
31
+ # Calls the block in context of +attribute+.
32
+ def nested(attribute, &block)
33
+ @path.push(attribute.to_sym)
34
+ block&.call
35
+ ensure
36
+ @path.pop
37
+ end
38
+
39
+ private
40
+
41
+ def wrap(error)
42
+ return error if @path.empty?
43
+
44
+ @path.reverse_each do |attribute|
45
+ error = NestedError.new(attribute, error)
46
+ end
47
+ error
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ module Naming
6
+ include ActiveModel::Naming
7
+ include ActiveModel::Translation
8
+
9
+ # Overrides <code>ActiveModel::Naming#model_name</code> to support
10
+ # anonymous model classes.
11
+ def model_name
12
+ @_model_name ||= begin
13
+ # Copied from ActiveModel::Naming#model_name
14
+ namespace = module_parents.detect do |m|
15
+ m.respond_to?(:use_relative_model_naming?) &&
16
+ m.use_relative_model_naming?
17
+ end
18
+ # Prevent that ActiveModel::Name::new raises an error if this is
19
+ # an anonymous class
20
+ klass = self
21
+ klass = klass.superclass while klass.name.nil?
22
+
23
+ ActiveModel::Name.new(klass, namespace)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ module Nestable
6
+
7
+ # Returns the value assigned to +name+.
8
+ def [](name)
9
+ raw_attributes[name&.to_s]&.value
10
+ end
11
+
12
+ # Returns +true+ if +name+ is present, false +otherwise+.
13
+ def attribute?(name)
14
+ raw_attributes.key?(name&.to_s)
15
+ end
16
+
17
+ # Returns a +Hash+ containing all attributes.
18
+ def attributes
19
+ raw_attributes.transform_values(&:value)
20
+ end
21
+
22
+ private
23
+
24
+ def validate_attributes(errors)
25
+ raw_attributes.map do |key, value|
26
+ errors.nested(key) do
27
+ next value.validate(errors) unless value.respond_to?(:model)
28
+ next true if (model = value.model).valid?
29
+
30
+ errors.merge!(model)
31
+ false
32
+ end
33
+ end.all?
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ # Wraps an error related to a nested model.
6
+ class NestedError
7
+ attr_reader :attribute, :error
8
+
9
+ delegate_missing_to :error
10
+
11
+ def initialize(attribute, error)
12
+ @attribute = attribute
13
+ @error = error
14
+ end
15
+
16
+ def ==(other) # :nodoc:
17
+ other.is_a?(self.class) &&
18
+ @attribute == other.attribute &&
19
+ @error == other.error
20
+ end
21
+
22
+ # Like <code>ActiveModel::Error#full_message</code>.
23
+ def full_message
24
+ base? ? "'#{attribute}' #{message}" : "'#{attribute}.#{message[1..]}"
25
+ end
26
+
27
+ # Like <code>ActiveModel::Error#match?</code>.
28
+ def match?(attribute, type = nil, **options)
29
+ return false if self.attribute != attribute
30
+ return true if type.nil? && options.empty?
31
+
32
+ @error.match?(:base, type, **options)
33
+ end
34
+
35
+ # Like <code>ActiveModel::Error#message</code>.
36
+ def message
37
+ base? ? @error.message : "'#{@error.attribute}' #{@error.message}".rstrip
38
+ end
39
+
40
+ # Like <code>ActiveModel::Error#strict_match?</code>.
41
+ def strict_match?(attribute, type = nil, **options)
42
+ return false unless match?(attribute, type, **options)
43
+
44
+ @error.strict_match?(:base, type, **options)
45
+ end
46
+
47
+ private
48
+
49
+ def base?
50
+ @error.attribute == :base
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Model
5
+ module Validations
6
+ extend ActiveSupport::Concern
7
+
8
+ include ActiveModel::Validations
9
+
10
+ included do
11
+ validate :nested_validity
12
+ end
13
+
14
+ # Overrides <code>ActiveModel::Validations#errors</code> to use
15
+ # Errors as error store.
16
+ def errors
17
+ @errors ||= Errors.new(self)
18
+ end
19
+
20
+ private
21
+
22
+ def nested_validity
23
+ nested.validate(errors)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'model/error'
4
+ require_relative 'model/nested_error'
5
+ require_relative 'model/errors'
6
+ require_relative 'model/attributes'
7
+ require_relative 'model/naming'
8
+ require_relative 'model/validations'
9
+ require_relative 'model/base'
10
+ require_relative 'model/nestable'
11
+
12
+ module Jsapi
13
+ # Provides classes and modules to deal with API models.
14
+ module Model end
15
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ # See https://bundler.io/guides/creating_gem.html
5
+ module Version # :nodoc:
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
data/lib/jsapi.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jsapi/model'
4
+ require 'jsapi/meta'
5
+ require 'jsapi/dsl'
6
+ require 'jsapi/json'
7
+ require 'jsapi/controller'
8
+ require 'jsapi/version'
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsapi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Denis Göller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Jsapi can be used to read requests, produce responses and create OpenAPI
14
+ documents
15
+ email: denis@dmgoeller.de
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/jsapi.rb
21
+ - lib/jsapi/controller.rb
22
+ - lib/jsapi/controller/base.rb
23
+ - lib/jsapi/controller/error_result.rb
24
+ - lib/jsapi/controller/methods.rb
25
+ - lib/jsapi/controller/parameters.rb
26
+ - lib/jsapi/controller/parameters_invalid.rb
27
+ - lib/jsapi/controller/response.rb
28
+ - lib/jsapi/dsl.rb
29
+ - lib/jsapi/dsl/callbacks.rb
30
+ - lib/jsapi/dsl/class_methods.rb
31
+ - lib/jsapi/dsl/definitions.rb
32
+ - lib/jsapi/dsl/error.rb
33
+ - lib/jsapi/dsl/examples.rb
34
+ - lib/jsapi/dsl/node.rb
35
+ - lib/jsapi/dsl/openapi.rb
36
+ - lib/jsapi/dsl/openapi/callback.rb
37
+ - lib/jsapi/dsl/openapi/root.rb
38
+ - lib/jsapi/dsl/operation.rb
39
+ - lib/jsapi/dsl/parameter.rb
40
+ - lib/jsapi/dsl/request_body.rb
41
+ - lib/jsapi/dsl/response.rb
42
+ - lib/jsapi/dsl/schema.rb
43
+ - lib/jsapi/json.rb
44
+ - lib/jsapi/json/array.rb
45
+ - lib/jsapi/json/boolean.rb
46
+ - lib/jsapi/json/integer.rb
47
+ - lib/jsapi/json/null.rb
48
+ - lib/jsapi/json/number.rb
49
+ - lib/jsapi/json/object.rb
50
+ - lib/jsapi/json/string.rb
51
+ - lib/jsapi/json/value.rb
52
+ - lib/jsapi/meta.rb
53
+ - lib/jsapi/meta/attributes.rb
54
+ - lib/jsapi/meta/attributes/class_methods.rb
55
+ - lib/jsapi/meta/attributes/type_caster.rb
56
+ - lib/jsapi/meta/base.rb
57
+ - lib/jsapi/meta/base_reference.rb
58
+ - lib/jsapi/meta/definitions.rb
59
+ - lib/jsapi/meta/example.rb
60
+ - lib/jsapi/meta/example/model.rb
61
+ - lib/jsapi/meta/example/reference.rb
62
+ - lib/jsapi/meta/existence.rb
63
+ - lib/jsapi/meta/invalid_argument_error.rb
64
+ - lib/jsapi/meta/openapi.rb
65
+ - lib/jsapi/meta/openapi/callback.rb
66
+ - lib/jsapi/meta/openapi/callback/model.rb
67
+ - lib/jsapi/meta/openapi/callback/reference.rb
68
+ - lib/jsapi/meta/openapi/contact.rb
69
+ - lib/jsapi/meta/openapi/external_documentation.rb
70
+ - lib/jsapi/meta/openapi/info.rb
71
+ - lib/jsapi/meta/openapi/license.rb
72
+ - lib/jsapi/meta/openapi/link.rb
73
+ - lib/jsapi/meta/openapi/link/model.rb
74
+ - lib/jsapi/meta/openapi/link/reference.rb
75
+ - lib/jsapi/meta/openapi/oauth_flow.rb
76
+ - lib/jsapi/meta/openapi/root.rb
77
+ - lib/jsapi/meta/openapi/security_requirement.rb
78
+ - lib/jsapi/meta/openapi/security_scheme.rb
79
+ - lib/jsapi/meta/openapi/security_scheme/api_key.rb
80
+ - lib/jsapi/meta/openapi/security_scheme/base.rb
81
+ - lib/jsapi/meta/openapi/security_scheme/http.rb
82
+ - lib/jsapi/meta/openapi/security_scheme/http/basic.rb
83
+ - lib/jsapi/meta/openapi/security_scheme/http/bearer.rb
84
+ - lib/jsapi/meta/openapi/security_scheme/http/other.rb
85
+ - lib/jsapi/meta/openapi/security_scheme/oauth2.rb
86
+ - lib/jsapi/meta/openapi/security_scheme/open_id_connect.rb
87
+ - lib/jsapi/meta/openapi/server.rb
88
+ - lib/jsapi/meta/openapi/server_variable.rb
89
+ - lib/jsapi/meta/openapi/tag.rb
90
+ - lib/jsapi/meta/openapi/version.rb
91
+ - lib/jsapi/meta/operation.rb
92
+ - lib/jsapi/meta/parameter.rb
93
+ - lib/jsapi/meta/parameter/model.rb
94
+ - lib/jsapi/meta/parameter/reference.rb
95
+ - lib/jsapi/meta/property.rb
96
+ - lib/jsapi/meta/reference_error.rb
97
+ - lib/jsapi/meta/request_body.rb
98
+ - lib/jsapi/meta/request_body/model.rb
99
+ - lib/jsapi/meta/request_body/reference.rb
100
+ - lib/jsapi/meta/rescue_handler.rb
101
+ - lib/jsapi/meta/response.rb
102
+ - lib/jsapi/meta/response/model.rb
103
+ - lib/jsapi/meta/response/reference.rb
104
+ - lib/jsapi/meta/schema.rb
105
+ - lib/jsapi/meta/schema/array.rb
106
+ - lib/jsapi/meta/schema/base.rb
107
+ - lib/jsapi/meta/schema/boolean.rb
108
+ - lib/jsapi/meta/schema/boundary.rb
109
+ - lib/jsapi/meta/schema/conversion.rb
110
+ - lib/jsapi/meta/schema/delegator.rb
111
+ - lib/jsapi/meta/schema/discriminator.rb
112
+ - lib/jsapi/meta/schema/integer.rb
113
+ - lib/jsapi/meta/schema/number.rb
114
+ - lib/jsapi/meta/schema/numeric.rb
115
+ - lib/jsapi/meta/schema/object.rb
116
+ - lib/jsapi/meta/schema/reference.rb
117
+ - lib/jsapi/meta/schema/string.rb
118
+ - lib/jsapi/meta/schema/validation.rb
119
+ - lib/jsapi/meta/schema/validation/base.rb
120
+ - lib/jsapi/meta/schema/validation/enum.rb
121
+ - lib/jsapi/meta/schema/validation/max_items.rb
122
+ - lib/jsapi/meta/schema/validation/max_length.rb
123
+ - lib/jsapi/meta/schema/validation/maximum.rb
124
+ - lib/jsapi/meta/schema/validation/min_items.rb
125
+ - lib/jsapi/meta/schema/validation/min_length.rb
126
+ - lib/jsapi/meta/schema/validation/minimum.rb
127
+ - lib/jsapi/meta/schema/validation/multiple_of.rb
128
+ - lib/jsapi/meta/schema/validation/pattern.rb
129
+ - lib/jsapi/model.rb
130
+ - lib/jsapi/model/attributes.rb
131
+ - lib/jsapi/model/base.rb
132
+ - lib/jsapi/model/error.rb
133
+ - lib/jsapi/model/errors.rb
134
+ - lib/jsapi/model/naming.rb
135
+ - lib/jsapi/model/nestable.rb
136
+ - lib/jsapi/model/nested_error.rb
137
+ - lib/jsapi/model/validations.rb
138
+ - lib/jsapi/version.rb
139
+ homepage: https://github.com/dmgoeller/jsapi
140
+ licenses:
141
+ - MIT
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 2.7.0
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubygems_version: 3.5.6
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Build JSON APIs with Rails
162
+ test_files: []