jsapi 0.4.1 → 0.6.0

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jsapi/controller/error_result.rb +11 -4
  3. data/lib/jsapi/controller/methods.rb +39 -13
  4. data/lib/jsapi/controller/parameters.rb +25 -23
  5. data/lib/jsapi/controller/parameters_invalid.rb +10 -7
  6. data/lib/jsapi/controller/response.rb +36 -19
  7. data/lib/jsapi/dsl/class_methods.rb +18 -10
  8. data/lib/jsapi/dsl/definitions.rb +11 -0
  9. data/lib/jsapi/dsl/openapi/callbacks.rb +34 -0
  10. data/lib/jsapi/dsl/openapi/examples.rb +32 -0
  11. data/lib/jsapi/dsl/openapi.rb +2 -0
  12. data/lib/jsapi/dsl/operation.rb +1 -1
  13. data/lib/jsapi/dsl/parameter.rb +1 -1
  14. data/lib/jsapi/dsl/request_body.rb +1 -1
  15. data/lib/jsapi/dsl/response.rb +1 -1
  16. data/lib/jsapi/dsl.rb +1 -3
  17. data/lib/jsapi/helpers/invalid_value_helper.rb +17 -0
  18. data/lib/jsapi/invalid_argument_error.rb +12 -0
  19. data/lib/jsapi/invalid_value_error.rb +12 -0
  20. data/lib/jsapi/json/object.rb +15 -14
  21. data/lib/jsapi/json.rb +1 -1
  22. data/lib/jsapi/meta/{attributes/class_methods.rb → base/attributes.rb} +7 -5
  23. data/lib/jsapi/meta/base/model.rb +44 -0
  24. data/lib/jsapi/meta/base/reference.rb +36 -0
  25. data/lib/jsapi/meta/{attributes → base}/type_caster.rb +2 -2
  26. data/lib/jsapi/meta/base.rb +4 -40
  27. data/lib/jsapi/meta/callable/symbol_evaluator.rb +30 -0
  28. data/lib/jsapi/meta/callable/symbol_sequence_evaluator.rb +29 -0
  29. data/lib/jsapi/meta/callable.rb +28 -0
  30. data/lib/jsapi/meta/defaults.rb +28 -0
  31. data/lib/jsapi/meta/definitions.rb +30 -25
  32. data/lib/jsapi/meta/openapi/callback/model.rb +1 -1
  33. data/lib/jsapi/meta/openapi/callback/reference.rb +1 -1
  34. data/lib/jsapi/meta/openapi/contact.rb +1 -1
  35. data/lib/jsapi/meta/openapi/example/model.rb +1 -1
  36. data/lib/jsapi/meta/openapi/example/reference.rb +1 -1
  37. data/lib/jsapi/meta/openapi/external_documentation.rb +1 -1
  38. data/lib/jsapi/meta/openapi/header/model.rb +19 -4
  39. data/lib/jsapi/meta/openapi/header/reference.rb +1 -1
  40. data/lib/jsapi/meta/openapi/info.rb +1 -1
  41. data/lib/jsapi/meta/openapi/license.rb +1 -1
  42. data/lib/jsapi/meta/openapi/link/model.rb +1 -1
  43. data/lib/jsapi/meta/openapi/link/reference.rb +1 -1
  44. data/lib/jsapi/meta/openapi/oauth_flow.rb +2 -2
  45. data/lib/jsapi/meta/openapi/root.rb +6 -20
  46. data/lib/jsapi/meta/openapi/security_requirement.rb +2 -2
  47. data/lib/jsapi/meta/openapi/security_scheme/base.rb +1 -1
  48. data/lib/jsapi/meta/openapi/security_scheme.rb +1 -1
  49. data/lib/jsapi/meta/openapi/server.rb +1 -1
  50. data/lib/jsapi/meta/openapi/server_variable.rb +1 -1
  51. data/lib/jsapi/meta/openapi/tag.rb +1 -1
  52. data/lib/jsapi/meta/operation.rb +21 -24
  53. data/lib/jsapi/meta/parameter/model.rb +6 -5
  54. data/lib/jsapi/meta/parameter/reference.rb +1 -1
  55. data/lib/jsapi/meta/property.rb +11 -5
  56. data/lib/jsapi/meta/request_body/model.rb +10 -5
  57. data/lib/jsapi/meta/request_body/reference.rb +1 -1
  58. data/lib/jsapi/meta/response/model.rb +11 -6
  59. data/lib/jsapi/meta/response/reference.rb +1 -1
  60. data/lib/jsapi/meta/schema/additional_properties.rb +8 -7
  61. data/lib/jsapi/meta/schema/base.rb +13 -7
  62. data/lib/jsapi/meta/schema/delegator.rb +2 -2
  63. data/lib/jsapi/meta/schema/discriminator.rb +3 -11
  64. data/lib/jsapi/meta/schema/object.rb +27 -4
  65. data/lib/jsapi/meta/schema/reference.rb +1 -1
  66. data/lib/jsapi/meta/schema.rb +12 -5
  67. data/lib/jsapi/meta.rb +3 -4
  68. data/lib/jsapi/model/attributes.rb +10 -4
  69. data/lib/jsapi/model/base.rb +1 -1
  70. data/lib/jsapi/model/nestable.rb +25 -10
  71. data/lib/jsapi/model/nested_error.rb +2 -2
  72. data/lib/jsapi/version.rb +1 -1
  73. data/lib/jsapi.rb +4 -0
  74. metadata +15 -10
  75. data/lib/jsapi/dsl/callbacks.rb +0 -32
  76. data/lib/jsapi/dsl/examples.rb +0 -30
  77. data/lib/jsapi/meta/attributes.rb +0 -4
  78. data/lib/jsapi/meta/base_reference.rb +0 -34
  79. data/lib/jsapi/meta/invalid_argument_error.rb +0 -12
@@ -3,33 +3,48 @@
3
3
  module Jsapi
4
4
  module Model
5
5
  module Nestable
6
-
7
6
  # Returns the value assigned to +name+.
8
7
  def [](name)
9
8
  raw_attributes[name&.to_s]&.value
10
9
  end
11
10
 
11
+ # Returns a hash containing the additional attributes.
12
+ def additional_attributes
13
+ raw_additional_attributes.transform_values(&:value)
14
+ end
15
+
12
16
  # Returns +true+ if +name+ is present, false +otherwise+.
13
17
  def attribute?(name)
14
18
  raw_attributes.key?(name&.to_s)
15
19
  end
16
20
 
17
- # Returns a +Hash+ containing all attributes.
21
+ # Returns a hash containing all attributes.
18
22
  def attributes
19
23
  raw_attributes.transform_values(&:value)
20
24
  end
21
25
 
26
+ def inspect # :nodoc:
27
+ "#<#{self.class.name} #{
28
+ raw_attributes
29
+ .merge('additional_attributes' => raw_additional_attributes)
30
+ .map { |k, v| "#{k}: #{v.inspect}" }
31
+ .join(', ')
32
+ }>"
33
+ end
34
+
22
35
  private
23
36
 
24
37
  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
38
+ [raw_attributes, raw_additional_attributes].compact.map do |attributes|
39
+ attributes.map do |name, value|
40
+ errors.nested(name) do
41
+ next value.validate(errors) unless value.respond_to?(:model)
42
+ next true if (model = value.model).valid?
43
+
44
+ errors.merge!(model)
45
+ false
46
+ end
47
+ end.all?
33
48
  end.all?
34
49
  end
35
50
  end
@@ -4,10 +4,10 @@ module Jsapi
4
4
  module Model
5
5
  # Wraps an error related to a nested model.
6
6
  class NestedError
7
- attr_reader :attribute, :error
8
-
9
7
  delegate_missing_to :error
10
8
 
9
+ attr_reader :attribute, :error
10
+
11
11
  def initialize(attribute, error)
12
12
  @attribute = attribute
13
13
  @error = error
data/lib/jsapi/version.rb CHANGED
@@ -5,6 +5,6 @@ module Jsapi
5
5
  # NOTE: See https://bundler.io/guides/creating_gem.html
6
6
 
7
7
  # The current GEM version.
8
- VERSION = '0.4.1'
8
+ VERSION = '0.6.0'
9
9
  end
10
10
  end
data/lib/jsapi.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'jsapi/helpers/invalid_value_helper'
4
+ require 'jsapi/invalid_value_error'
5
+ require 'jsapi/invalid_argument_error'
6
+
3
7
  require 'jsapi/model'
4
8
  require 'jsapi/meta'
5
9
  require 'jsapi/dsl'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Göller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-21 00:00:00.000000000 Z
11
+ date: 2024-09-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Jsapi can be used to read requests, produce responses and create OpenAPI
14
14
  documents
@@ -26,20 +26,23 @@ files:
26
26
  - lib/jsapi/controller/parameters_invalid.rb
27
27
  - lib/jsapi/controller/response.rb
28
28
  - lib/jsapi/dsl.rb
29
- - lib/jsapi/dsl/callbacks.rb
30
29
  - lib/jsapi/dsl/class_methods.rb
31
30
  - lib/jsapi/dsl/definitions.rb
32
31
  - lib/jsapi/dsl/error.rb
33
- - lib/jsapi/dsl/examples.rb
34
32
  - lib/jsapi/dsl/node.rb
35
33
  - lib/jsapi/dsl/openapi.rb
36
34
  - lib/jsapi/dsl/openapi/callback.rb
35
+ - lib/jsapi/dsl/openapi/callbacks.rb
36
+ - lib/jsapi/dsl/openapi/examples.rb
37
37
  - lib/jsapi/dsl/openapi/root.rb
38
38
  - lib/jsapi/dsl/operation.rb
39
39
  - lib/jsapi/dsl/parameter.rb
40
40
  - lib/jsapi/dsl/request_body.rb
41
41
  - lib/jsapi/dsl/response.rb
42
42
  - lib/jsapi/dsl/schema.rb
43
+ - lib/jsapi/helpers/invalid_value_helper.rb
44
+ - lib/jsapi/invalid_argument_error.rb
45
+ - lib/jsapi/invalid_value_error.rb
43
46
  - lib/jsapi/json.rb
44
47
  - lib/jsapi/json/array.rb
45
48
  - lib/jsapi/json/boolean.rb
@@ -50,14 +53,17 @@ files:
50
53
  - lib/jsapi/json/string.rb
51
54
  - lib/jsapi/json/value.rb
52
55
  - 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
56
  - lib/jsapi/meta/base.rb
57
- - lib/jsapi/meta/base_reference.rb
57
+ - lib/jsapi/meta/base/attributes.rb
58
+ - lib/jsapi/meta/base/model.rb
59
+ - lib/jsapi/meta/base/reference.rb
60
+ - lib/jsapi/meta/base/type_caster.rb
61
+ - lib/jsapi/meta/callable.rb
62
+ - lib/jsapi/meta/callable/symbol_evaluator.rb
63
+ - lib/jsapi/meta/callable/symbol_sequence_evaluator.rb
64
+ - lib/jsapi/meta/defaults.rb
58
65
  - lib/jsapi/meta/definitions.rb
59
66
  - lib/jsapi/meta/existence.rb
60
- - lib/jsapi/meta/invalid_argument_error.rb
61
67
  - lib/jsapi/meta/openapi.rb
62
68
  - lib/jsapi/meta/openapi/callback.rb
63
69
  - lib/jsapi/meta/openapi/callback/model.rb
@@ -146,7 +152,6 @@ licenses:
146
152
  - MIT
147
153
  metadata:
148
154
  homepage_uri: https://github.com/dmgoeller/jsapi
149
- source_code_uri: https://github.com/dmgoeller/jsapi
150
155
  post_install_message:
151
156
  rdoc_options: []
152
157
  require_paths:
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jsapi
4
- module DSL
5
- module Callbacks
6
- # Defines an \OpenAPI callback or refers a reusable callback.
7
- #
8
- # # define a callback
9
- # callback 'foo' do
10
- # operation '{$request.query.foo}'
11
- # end
12
- #
13
- # # refer a reusable callback
14
- # callback ref: 'foo'
15
- #
16
- # Refers the reusable callback with the same name if neither any
17
- # keywords nor a block is specified.
18
- #
19
- # callback 'foo'
20
- #
21
- def callback(name = nil, **keywords, &block)
22
- _define('callback', name&.inspect) do
23
- name = keywords[:ref] if name.nil?
24
- keywords = { ref: name } unless keywords.any? || block
25
-
26
- callback_model = _meta_model.add_callback(name, keywords)
27
- _eval(callback_model, OpenAPI::Callback, &block)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jsapi
4
- module DSL
5
- module Examples
6
- # Adds an example.
7
- #
8
- # example 'foo', value: 'bar'
9
- #
10
- # example 'foo'
11
- #
12
- # The default name is <code>'default'</code>.
13
- def example(name_or_value = nil, **keywords, &block)
14
- _define('example', name_or_value&.inspect) do
15
- if keywords.any? || block
16
- # example 'foo', value: 'bar', ...
17
- name = name_or_value
18
- else
19
- # example 'foo'
20
- name = nil
21
- keywords = { value: name_or_value }
22
- end
23
-
24
- example = _meta_model.add_example(name, keywords)
25
- Node.new(example, &block) if block
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'attributes/type_caster'
4
- require_relative 'attributes/class_methods'
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jsapi
4
- module Meta
5
- # The base reference class.
6
- class BaseReference < Base
7
- ##
8
- # :attr: ref
9
- # The name of the referred object.
10
- attribute :ref, String
11
-
12
- # Returns the name of the method to be invoked to look up the referred object
13
- # in a Definitions instance.
14
- def self.lookup_method_name
15
- @lookup_method_name ||=
16
- name.delete_suffix('::Reference').demodulize.underscore
17
- end
18
-
19
- def reference? # :nodoc:
20
- true
21
- end
22
-
23
- # Resolves +ref+ by looking up the object with that name in +definitions+.
24
- #
25
- # Raises a ReferenceError if +ref+ could not be resolved.
26
- def resolve(definitions)
27
- object = definitions.send(self.class.lookup_method_name, ref)
28
- raise ReferenceError, ref if object.nil?
29
-
30
- object.resolve(definitions)
31
- end
32
- end
33
- end
34
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Jsapi
4
- module Meta
5
- # Raised when an argument isn't contained in the list of valid values.
6
- class InvalidArgumentError < ArgumentError
7
- def initialize(name, value, values)
8
- super("#{name} must be one of #{values.inspect}, is #{value.inspect}")
9
- end
10
- end
11
- end
12
- end