apia 3.0.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.
- checksums.yaml +7 -0
- data/VERSION +1 -0
- data/lib/apia.rb +21 -0
- data/lib/apia/api.rb +100 -0
- data/lib/apia/argument_set.rb +221 -0
- data/lib/apia/authenticator.rb +57 -0
- data/lib/apia/callable_with_environment.rb +43 -0
- data/lib/apia/controller.rb +32 -0
- data/lib/apia/defineable.rb +60 -0
- data/lib/apia/definition.rb +27 -0
- data/lib/apia/definitions/api.rb +51 -0
- data/lib/apia/definitions/argument.rb +77 -0
- data/lib/apia/definitions/argument_set.rb +33 -0
- data/lib/apia/definitions/authenticator.rb +46 -0
- data/lib/apia/definitions/controller.rb +41 -0
- data/lib/apia/definitions/endpoint.rb +74 -0
- data/lib/apia/definitions/enum.rb +31 -0
- data/lib/apia/definitions/error.rb +59 -0
- data/lib/apia/definitions/field.rb +117 -0
- data/lib/apia/definitions/lookup_argument_set.rb +27 -0
- data/lib/apia/definitions/object.rb +29 -0
- data/lib/apia/definitions/polymorph.rb +29 -0
- data/lib/apia/definitions/polymorph_option.rb +53 -0
- data/lib/apia/definitions/scalar.rb +23 -0
- data/lib/apia/definitions/type.rb +109 -0
- data/lib/apia/dsl.rb +23 -0
- data/lib/apia/dsls/api.rb +37 -0
- data/lib/apia/dsls/argument.rb +27 -0
- data/lib/apia/dsls/argument_set.rb +35 -0
- data/lib/apia/dsls/authenticator.rb +38 -0
- data/lib/apia/dsls/concerns/has_fields.rb +38 -0
- data/lib/apia/dsls/controller.rb +34 -0
- data/lib/apia/dsls/endpoint.rb +79 -0
- data/lib/apia/dsls/enum.rb +19 -0
- data/lib/apia/dsls/error.rb +26 -0
- data/lib/apia/dsls/field.rb +27 -0
- data/lib/apia/dsls/lookup_argument_set.rb +24 -0
- data/lib/apia/dsls/object.rb +19 -0
- data/lib/apia/dsls/polymorph.rb +19 -0
- data/lib/apia/dsls/route_group.rb +43 -0
- data/lib/apia/dsls/route_set.rb +40 -0
- data/lib/apia/dsls/scalar.rb +23 -0
- data/lib/apia/dsls/scope_descriptions.rb +17 -0
- data/lib/apia/endpoint.rb +110 -0
- data/lib/apia/enum.rb +43 -0
- data/lib/apia/environment_error_handling.rb +74 -0
- data/lib/apia/error.rb +61 -0
- data/lib/apia/error_set.rb +15 -0
- data/lib/apia/errors/error_exception_error.rb +32 -0
- data/lib/apia/errors/field_spec_parse_error.rb +23 -0
- data/lib/apia/errors/invalid_argument_error.rb +68 -0
- data/lib/apia/errors/invalid_enum_option_error.rb +21 -0
- data/lib/apia/errors/invalid_helper_error.rb +6 -0
- data/lib/apia/errors/invalid_json_error.rb +23 -0
- data/lib/apia/errors/invalid_polymorph_value_error.rb +21 -0
- data/lib/apia/errors/invalid_scalar_value_error.rb +21 -0
- data/lib/apia/errors/manifest_error.rb +43 -0
- data/lib/apia/errors/missing_argument_error.rb +40 -0
- data/lib/apia/errors/null_field_value_error.rb +37 -0
- data/lib/apia/errors/parse_error.rb +10 -0
- data/lib/apia/errors/runtime_error.rb +30 -0
- data/lib/apia/errors/scope_not_granted_error.rb +15 -0
- data/lib/apia/errors/standard_error.rb +6 -0
- data/lib/apia/field_set.rb +76 -0
- data/lib/apia/field_spec.rb +155 -0
- data/lib/apia/helpers.rb +34 -0
- data/lib/apia/hook_set.rb +30 -0
- data/lib/apia/lookup_argument_set.rb +57 -0
- data/lib/apia/lookup_environment.rb +27 -0
- data/lib/apia/manifest_errors.rb +62 -0
- data/lib/apia/mock_request.rb +18 -0
- data/lib/apia/object.rb +68 -0
- data/lib/apia/object_set.rb +21 -0
- data/lib/apia/pagination_object.rb +34 -0
- data/lib/apia/polymorph.rb +50 -0
- data/lib/apia/rack.rb +184 -0
- data/lib/apia/rack_error.rb +17 -0
- data/lib/apia/request.rb +67 -0
- data/lib/apia/request_environment.rb +84 -0
- data/lib/apia/request_headers.rb +42 -0
- data/lib/apia/response.rb +64 -0
- data/lib/apia/route.rb +61 -0
- data/lib/apia/route_group.rb +20 -0
- data/lib/apia/route_set.rb +89 -0
- data/lib/apia/scalar.rb +52 -0
- data/lib/apia/scalars.rb +25 -0
- data/lib/apia/scalars/base64.rb +31 -0
- data/lib/apia/scalars/boolean.rb +37 -0
- data/lib/apia/scalars/date.rb +45 -0
- data/lib/apia/scalars/decimal.rb +36 -0
- data/lib/apia/scalars/integer.rb +34 -0
- data/lib/apia/scalars/string.rb +24 -0
- data/lib/apia/scalars/unix_time.rb +40 -0
- data/lib/apia/schema/api_controller_schema_type.rb +17 -0
- data/lib/apia/schema/api_schema_type.rb +43 -0
- data/lib/apia/schema/argument_schema_type.rb +28 -0
- data/lib/apia/schema/argument_set_schema_type.rb +21 -0
- data/lib/apia/schema/authenticator_schema_type.rb +22 -0
- data/lib/apia/schema/controller.rb +39 -0
- data/lib/apia/schema/controller_endpoint_schema_type.rb +17 -0
- data/lib/apia/schema/controller_schema_type.rb +32 -0
- data/lib/apia/schema/endpoint_schema_type.rb +35 -0
- data/lib/apia/schema/enum_schema_type.rb +20 -0
- data/lib/apia/schema/enum_value_schema_type.rb +14 -0
- data/lib/apia/schema/error_schema_type.rb +23 -0
- data/lib/apia/schema/field_schema_type.rb +38 -0
- data/lib/apia/schema/field_spec_options_schema_type.rb +16 -0
- data/lib/apia/schema/lookup_argument_set_schema_type.rb +25 -0
- data/lib/apia/schema/object_schema_polymorph.rb +31 -0
- data/lib/apia/schema/object_schema_type.rb +21 -0
- data/lib/apia/schema/polymorph_option_schema_type.rb +16 -0
- data/lib/apia/schema/polymorph_schema_type.rb +20 -0
- data/lib/apia/schema/request_method_enum.rb +21 -0
- data/lib/apia/schema/route_group_schema_type.rb +19 -0
- data/lib/apia/schema/route_schema_type.rb +31 -0
- data/lib/apia/schema/route_set_schema_type.rb +20 -0
- data/lib/apia/schema/scalar_schema_type.rb +15 -0
- data/lib/apia/schema/scope_type.rb +14 -0
- data/lib/apia/version.rb +12 -0
- metadata +188 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/scalars'
|
4
|
+
require 'apia/scalar'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Scalars
|
8
|
+
class Decimal < Apia::Scalar
|
9
|
+
|
10
|
+
Scalars.register :decimal, self
|
11
|
+
|
12
|
+
name 'Decimal'
|
13
|
+
|
14
|
+
cast do |value|
|
15
|
+
value.to_f
|
16
|
+
end
|
17
|
+
|
18
|
+
validator do |value|
|
19
|
+
value.is_a?(::Float)
|
20
|
+
end
|
21
|
+
|
22
|
+
parse do |value|
|
23
|
+
if value.is_a?(::String) && value =~ /\A-?\d+(\.\d+)?\z/
|
24
|
+
value.to_f
|
25
|
+
elsif value.is_a?(::Float)
|
26
|
+
value
|
27
|
+
elsif value.is_a?(::Integer)
|
28
|
+
value.to_i
|
29
|
+
else
|
30
|
+
raise Apia::ParseError, 'Decimal must be provided as a decimal, integer or a string only containing numbers'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/scalars'
|
4
|
+
require 'apia/scalar'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Scalars
|
8
|
+
class Integer < Apia::Scalar
|
9
|
+
|
10
|
+
Scalars.register :integer, self
|
11
|
+
|
12
|
+
name 'Integer'
|
13
|
+
|
14
|
+
cast do |value|
|
15
|
+
value.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
validator do |value|
|
19
|
+
value.is_a?(::Integer)
|
20
|
+
end
|
21
|
+
|
22
|
+
parse do |value|
|
23
|
+
if value.is_a?(::String) && value =~ /\A-?\d+\z/
|
24
|
+
value.to_i
|
25
|
+
elsif value.is_a?(::Integer)
|
26
|
+
value
|
27
|
+
else
|
28
|
+
raise Apia::ParseError, 'Integer must be provided as an integer or a string only containing numbers'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/scalars'
|
4
|
+
require 'apia/scalar'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Scalars
|
8
|
+
class String < Apia::Scalar
|
9
|
+
|
10
|
+
Scalars.register :string, self
|
11
|
+
|
12
|
+
name 'String'
|
13
|
+
|
14
|
+
cast do |value|
|
15
|
+
value.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
validator do |value|
|
19
|
+
value.is_a?(::String) || value.is_a?(::Symbol)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
require 'apia/scalars'
|
5
|
+
require 'apia/scalar'
|
6
|
+
require 'apia/errors/parse_error'
|
7
|
+
|
8
|
+
module Apia
|
9
|
+
module Scalars
|
10
|
+
class UnixTime < Apia::Scalar
|
11
|
+
|
12
|
+
Scalars.register :unix_time, self
|
13
|
+
|
14
|
+
name 'Unix Timestamp'
|
15
|
+
|
16
|
+
cast do |time|
|
17
|
+
time.to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
validator do |value|
|
21
|
+
value.is_a?(::Time)
|
22
|
+
end
|
23
|
+
|
24
|
+
parse do |integer|
|
25
|
+
next integer if integer.is_a?(::Time)
|
26
|
+
|
27
|
+
unless integer.is_a?(::Integer)
|
28
|
+
raise Apia::ParseError, 'Time must be provided as an integer'
|
29
|
+
end
|
30
|
+
|
31
|
+
if integer.negative?
|
32
|
+
raise Apia::ParseError, 'Integer must be positive or zero'
|
33
|
+
end
|
34
|
+
|
35
|
+
Time.at(integer).utc
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/controller_schema_type'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Schema
|
8
|
+
class APIControllerSchemaType < Apia::Object
|
9
|
+
|
10
|
+
no_schema
|
11
|
+
|
12
|
+
field :name, type: :string
|
13
|
+
field :controller, type: :string
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/authenticator_schema_type'
|
5
|
+
require 'apia/schema/api_controller_schema_type'
|
6
|
+
require 'apia/schema/object_schema_polymorph'
|
7
|
+
require 'apia/schema/route_set_schema_type'
|
8
|
+
require 'apia/schema/scope_type'
|
9
|
+
|
10
|
+
module Apia
|
11
|
+
module Schema
|
12
|
+
class APISchemaType < Apia::Object
|
13
|
+
|
14
|
+
no_schema
|
15
|
+
|
16
|
+
condition { |api| api.schema? }
|
17
|
+
|
18
|
+
field :id, type: :string do
|
19
|
+
backend { |api| api.id }
|
20
|
+
end
|
21
|
+
|
22
|
+
field :name, type: :string, null: true do
|
23
|
+
backend { |api| api.name }
|
24
|
+
end
|
25
|
+
|
26
|
+
field :description, type: :string, null: true do
|
27
|
+
backend { |api| api.description }
|
28
|
+
end
|
29
|
+
|
30
|
+
field :authenticator, type: :string, null: true do
|
31
|
+
backend { |api| api.authenticator&.definition&.id }
|
32
|
+
end
|
33
|
+
|
34
|
+
field :route_set, type: RouteSetSchemaType
|
35
|
+
field :scopes, type: [ScopeType] do
|
36
|
+
backend do |api|
|
37
|
+
api.scopes.map { |k, v| v.merge(name: k) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
|
5
|
+
module Apia
|
6
|
+
module Schema
|
7
|
+
class ArgumentSchemaType < Apia::Object
|
8
|
+
|
9
|
+
no_schema
|
10
|
+
|
11
|
+
field :name, type: :string
|
12
|
+
field :description, type: :string, null: true
|
13
|
+
field :type, type: :string do
|
14
|
+
backend { |f| f.type.id }
|
15
|
+
end
|
16
|
+
field :required, type: :boolean do
|
17
|
+
backend(&:required?)
|
18
|
+
end
|
19
|
+
field :array, type: :boolean do
|
20
|
+
backend(&:array?)
|
21
|
+
end
|
22
|
+
field :default, type: :string, null: true do
|
23
|
+
backend { |o| o.default&.to_s }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/argument_schema_type'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Schema
|
8
|
+
class ArgumentSetSchemaType < Apia::Object
|
9
|
+
|
10
|
+
no_schema
|
11
|
+
|
12
|
+
field :id, type: :string
|
13
|
+
field :name, type: :string, null: true
|
14
|
+
field :description, type: :string, null: true
|
15
|
+
field :arguments, type: [ArgumentSchemaType] do
|
16
|
+
backend { |as| as.arguments.values }
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/error_schema_type'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Schema
|
8
|
+
class AuthenticatorSchemaType < Apia::Object
|
9
|
+
|
10
|
+
no_schema
|
11
|
+
|
12
|
+
field :id, type: :string
|
13
|
+
field :name, type: :string, null: true
|
14
|
+
field :description, type: :string, null: true
|
15
|
+
field :type, type: :string
|
16
|
+
field :potential_errors, type: [:string] do
|
17
|
+
backend { |a| a.potential_errors.map { |e| e.definition.id } }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/controller'
|
4
|
+
require 'apia/authenticator'
|
5
|
+
require 'apia/schema/object_schema_polymorph'
|
6
|
+
require 'apia/schema/route_set_schema_type'
|
7
|
+
|
8
|
+
module Apia
|
9
|
+
module Schema
|
10
|
+
class Controller < Apia::Controller
|
11
|
+
|
12
|
+
no_schema
|
13
|
+
|
14
|
+
authenticator do
|
15
|
+
type :anonymous
|
16
|
+
end
|
17
|
+
|
18
|
+
name 'API Schema'
|
19
|
+
description 'Provides endpoint to interrogate the API schema'
|
20
|
+
endpoint :schema do
|
21
|
+
no_schema
|
22
|
+
description 'Returns a payload outlining the full schema of the API'
|
23
|
+
field :schema_version, type: :integer
|
24
|
+
field :host, type: :string
|
25
|
+
field :namespace, type: :string
|
26
|
+
field :api, type: :string
|
27
|
+
field :objects, type: [ObjectSchemaPolymorph]
|
28
|
+
action do
|
29
|
+
response.add_field :schema_version, 1
|
30
|
+
response.add_field :objects, request.api.objects.map(&:definition).select(&:schema?)
|
31
|
+
response.add_field :api, request.api.definition.id
|
32
|
+
response.add_field :namespace, request.namespace
|
33
|
+
response.add_field :host, request.host
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/endpoint_schema_type'
|
5
|
+
|
6
|
+
module Apia
|
7
|
+
module Schema
|
8
|
+
class ControllerEndpointSchemaType < Apia::Object
|
9
|
+
|
10
|
+
no_schema
|
11
|
+
|
12
|
+
field :name, type: :string
|
13
|
+
field :endpoint, type: :string
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/authenticator_schema_type'
|
5
|
+
require 'apia/schema/controller_endpoint_schema_type'
|
6
|
+
|
7
|
+
module Apia
|
8
|
+
module Schema
|
9
|
+
class ControllerSchemaType < Apia::Object
|
10
|
+
|
11
|
+
no_schema
|
12
|
+
|
13
|
+
field :id, type: :string
|
14
|
+
field :name, type: :string, null: true
|
15
|
+
field :description, type: :string, null: true
|
16
|
+
field :authenticator, type: :string, null: true do
|
17
|
+
backend { |c| c.authenticator&.definition&.id }
|
18
|
+
end
|
19
|
+
field :endpoints, type: [ControllerEndpointSchemaType] do
|
20
|
+
backend do |c|
|
21
|
+
c.endpoints.map do |key, endpoint|
|
22
|
+
{
|
23
|
+
name: key.to_s,
|
24
|
+
endpoint: endpoint.definition.id
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/object'
|
4
|
+
require 'apia/schema/authenticator_schema_type'
|
5
|
+
require 'apia/schema/field_schema_type'
|
6
|
+
require 'apia/schema/argument_set_schema_type'
|
7
|
+
require 'apia/schema/error_schema_type'
|
8
|
+
|
9
|
+
module Apia
|
10
|
+
module Schema
|
11
|
+
class EndpointSchemaType < Apia::Object
|
12
|
+
|
13
|
+
no_schema
|
14
|
+
|
15
|
+
field :id, type: :string
|
16
|
+
field :name, type: :string, null: true
|
17
|
+
field :description, type: :string, null: true
|
18
|
+
field :http_status, type: :integer, backend: :http_status_code
|
19
|
+
field :authenticator, type: :string, null: true do
|
20
|
+
backend { |e| e.authenticator&.definition&.id }
|
21
|
+
end
|
22
|
+
field :argument_set, type: ArgumentSetSchemaType do
|
23
|
+
backend { |e| e.argument_set.definition }
|
24
|
+
end
|
25
|
+
field :fields, type: [FieldSchemaType] do
|
26
|
+
backend { |e| e.fields.values }
|
27
|
+
end
|
28
|
+
field :potential_errors, type: [:string] do
|
29
|
+
backend { |a| a.potential_errors.map { |e| e.definition.id } }
|
30
|
+
end
|
31
|
+
field :scopes, type: [:string]
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'apia/schema/enum_value_schema_type'
|
4
|
+
|
5
|
+
module Apia
|
6
|
+
module Schema
|
7
|
+
class EnumSchemaType < Apia::Object
|
8
|
+
|
9
|
+
no_schema
|
10
|
+
|
11
|
+
field :id, type: :string
|
12
|
+
field :name, type: :string, null: true
|
13
|
+
field :description, type: :string, null: true
|
14
|
+
field :values, type: [EnumValueSchemaType] do
|
15
|
+
backend { |e| e.values.values }
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|