ree_lib 1.0.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be5ae7ea8b9a8508ae04cc0caf741b87bc67b974c0a14d6cfbabef16607e1c81
4
- data.tar.gz: fc7feb07cf62419e03262e4910fa9d02ac8c1b0eed9f60f76a4282f61357985f
3
+ metadata.gz: ff525a1db86ff974abe2f0095d70921fa49e324b808723042b1671140b372809
4
+ data.tar.gz: 899723f369a42828b8dc094cdcaf96c10d78704e23f95b9500ed76d453858f3b
5
5
  SHA512:
6
- metadata.gz: ff19ea51129ec5d6f3fdace442c2264fc8af6071e9e92f769916c3faea5da8aa9e59c04bcb94f6e063f0b363407d2c8b64ba7ce8136c750831b0ae60337d356d
7
- data.tar.gz: 777a59bf5a429a99d9f0c3e749d79a8af0223a08a1028cbae5d74d759fa6519bc12b48c36dc016373337e51d1f1427aca116acb0ccc26aaeac1a762891d28cd7
6
+ metadata.gz: 8a8630ad6fbb14f70ffef61be34708befd543be814a29fb81afda8a9020b8b46222e4aca37662e8504dbab8d43d408e9850168acc50595962245c93a4b377155
7
+ data.tar.gz: 1eb4b5d094c9b5aabf5882f5c055594348ea7a818920a1e55e87f48765e66dd0e2718a6643d7d4ba65f70ded911dd2a5575ad401497a5c69765f0700f34804cc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.0)
4
+ ree_lib (1.0.3)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -36,11 +36,11 @@ GEM
36
36
  crass (~> 1.0.2)
37
37
  nokogiri (>= 1.5.9)
38
38
  msgpack (1.5.3)
39
- nokogiri (1.13.7-x86_64-darwin)
39
+ nokogiri (1.13.8-x86_64-darwin)
40
40
  racc (~> 1.4)
41
- nokogiri (1.13.7-x86_64-linux)
41
+ nokogiri (1.13.8-x86_64-linux)
42
42
  racc (~> 1.4)
43
- oj (3.13.17)
43
+ oj (3.13.19)
44
44
  pg (1.4.1)
45
45
  public_suffix (4.0.7)
46
46
  racc (1.6.0)
@@ -10,6 +10,9 @@
10
10
  {
11
11
  "name": "ree_mapper"
12
12
  },
13
+ {
14
+ "name": "ree_swagger"
15
+ },
13
16
  {
14
17
  "name": "ree_validator"
15
18
  }
@@ -1,3 +1,5 @@
1
+ package_require 'ree_swagger/functions/register_type'
2
+
1
3
  module ReeEnum
2
4
  module DSL
3
5
  def self.included(base)
@@ -22,80 +24,102 @@ module ReeEnum
22
24
  Ree.container.compile(dsl.package, name)
23
25
  end
24
26
 
25
- def register_as_mapper_type
26
- mapper_factory = ReeMapper.get_mapper_factory(
27
- Object.const_get(self.name.split('::').first)
28
- )
27
+ def type_for_mapper
28
+ @type_for_mapper ||= begin
29
+ klass = Class.new(ReeMapper::AbstractType) do
30
+ def initialize(enum)
31
+ @enum = enum
32
+ end
29
33
 
30
- klass = Class.new(ReeMapper::AbstractType) do
31
- def initialize(enum)
32
- @enum = enum
33
- end
34
+ contract(
35
+ ReeEnum::Value,
36
+ Kwargs[
37
+ role: Nilor[Symbol, ArrayOf[Symbol]]
38
+ ] => String
39
+ )
40
+ def serialize(value, role: nil)
41
+ value.to_s
42
+ end
34
43
 
35
- contract(
36
- ReeEnum::Value,
37
- Kwargs[
38
- role: Nilor[Symbol, ArrayOf[Symbol]]
39
- ] => String
40
- )
41
- def serialize(value, role: nil)
42
- value.to_s
43
- end
44
+ contract(
45
+ Any,
46
+ Kwargs[
47
+ role: Nilor[Symbol, ArrayOf[Symbol]]
48
+ ] => ReeEnum::Value
49
+ ).throws(ReeMapper::CoercionError)
50
+ def cast(value, role: nil)
51
+ if value.is_a?(String)
52
+ enum_val = @enum.values.all.detect { |v| v.to_s == value }
44
53
 
45
- contract(
46
- Any,
47
- Kwargs[
48
- role: Nilor[Symbol, ArrayOf[Symbol]]
49
- ] => ReeEnum::Value
50
- ).throws(ReeMapper::CoercionError)
51
- def cast(value, role: nil)
52
- if value.is_a?(String)
53
- enum_val = @enum.values.all.detect { |v| v.to_s == value }
54
-
55
- if !enum_val
56
- raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
57
- end
54
+ if !enum_val
55
+ raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
56
+ end
58
57
 
59
- enum_val
60
- elsif value.is_a?(Integer)
61
- enum_val = @enum.values.all.detect { |v| v.to_i == value }
58
+ enum_val
59
+ elsif value.is_a?(Integer)
60
+ enum_val = @enum.values.all.detect { |v| v.to_i == value }
62
61
 
63
- if !enum_val
62
+ if !enum_val
63
+ raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
64
+ end
65
+
66
+ enum_val
67
+ else
64
68
  raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
65
69
  end
70
+ end
66
71
 
67
- enum_val
68
- else
69
- raise ReeMapper::CoercionError, "should be one of #{@enum.values.all.map(&:to_s).inspect}"
72
+ contract(
73
+ ReeEnum::Value,
74
+ Kwargs[
75
+ role: Nilor[Symbol, ArrayOf[Symbol]]
76
+ ] => Integer
77
+ )
78
+ def db_dump(value, role: nil)
79
+ value.to_i
70
80
  end
71
- end
72
81
 
73
- contract(
74
- ReeEnum::Value,
75
- Kwargs[
76
- role: Nilor[Symbol, ArrayOf[Symbol]]
77
- ] => Integer
78
- )
79
- def db_dump(value, role: nil)
80
- value.to_i
82
+ contract(
83
+ Integer,
84
+ Kwargs[
85
+ role: Nilor[Symbol, ArrayOf[Symbol]]
86
+ ] => ReeEnum::Value
87
+ ).throws(ReeMapper::TypeError)
88
+ def db_load(value, role: nil)
89
+ cast(value, role: role)
90
+ end
81
91
  end
82
92
 
83
- contract(
84
- Integer,
85
- Kwargs[
86
- role: Nilor[Symbol, ArrayOf[Symbol]]
87
- ] => ReeEnum::Value
88
- ).throws(ReeMapper::TypeError)
89
- def db_load(value, role: nil)
90
- cast(value, role: role)
91
- end
93
+ klass.new(self)
92
94
  end
95
+ end
93
96
 
94
- mapper_factory.register(
95
- self.enum_name,
96
- ReeMapper::Mapper.build(
97
- mapper_factory.strategies, klass.new(self)
97
+ def register_as_swagger_type
98
+ swagger_type_registrator = ReeSwagger::RegisterType.new
99
+
100
+ [:casters, :serializers].each do |kind|
101
+ swagger_type_registrator.call(
102
+ kind,
103
+ type_for_mapper.class,
104
+ ->(*) {
105
+ {
106
+ type: 'string',
107
+ enum: values.all.map(&:to_s)
108
+ }
109
+ }
98
110
  )
111
+ end
112
+ end
113
+
114
+ def register_as_mapper_type
115
+ register_as_swagger_type
116
+
117
+ mapper_factory = ReeMapper.get_mapper_factory(
118
+ Object.const_get(self.name.split('::').first)
119
+ )
120
+
121
+ mapper_factory.register_type(
122
+ self.enum_name, type_for_mapper
99
123
  )
100
124
  end
101
125
  end
@@ -5,6 +5,7 @@ module ReeEnum
5
5
 
6
6
  package do
7
7
  depends_on :ree_mapper
8
+ depends_on :ree_swagger
8
9
  depends_on :ree_validator
9
10
  end
10
11
  end
@@ -6,5 +6,4 @@ module ReeJson
6
6
  package do
7
7
  depends_on :ree_hash
8
8
  end
9
-
10
9
  end
@@ -83,7 +83,7 @@ class ReeLogger::MultiLogger < Logger
83
83
  end
84
84
 
85
85
  contract(String, Hash, Nilor[Exception], Bool => nil)
86
- def unknown(message, parameters = {}, exception =nil, log_args = true)
86
+ def unknown(message, parameters = {}, exception = nil, log_args = true)
87
87
  log(:unknown, message, parameters, exception, true)
88
88
  end
89
89
 
@@ -11,6 +11,14 @@ class ReeMapper::MapperFactory
11
11
  string: ReeMapper::StringKeyHashOutput
12
12
  }.freeze
13
13
 
14
+ contract(Symbol, Any => Class).throws(ArgumentError)
15
+ def self.register_type(name, object_type)
16
+ register(
17
+ name,
18
+ ReeMapper::Mapper.build(strategies, object_type)
19
+ )
20
+ end
21
+
14
22
  contract(Symbol, Any => Class).throws(ArgumentError)
15
23
  def self.register(name, type)
16
24
  raise ArgumentError, "name of mapper type should not include `?`" if name.to_s.end_with?('?')
@@ -10,6 +10,9 @@
10
10
  {
11
11
  "name": "ree_dto"
12
12
  },
13
+ {
14
+ "name": "ree_enum"
15
+ },
13
16
  {
14
17
  "name": "ree_hash"
15
18
  },
@@ -9,40 +9,40 @@ class ReeSwagger::TypeDefinitionsRepo
9
9
  def build
10
10
  {
11
11
  serializers: {
12
- 'ReeMapper::Integer' => ->(*) {
12
+ ReeMapper::Integer => ->(*) {
13
13
  { type: 'integer' }
14
14
  },
15
- 'ReeMapper::String' => ->(*) {
15
+ ReeMapper::String => ->(*) {
16
16
  { type: 'string' }
17
17
  },
18
- 'ReeMapper::Bool' => ->(*) {
18
+ ReeMapper::Bool => ->(*) {
19
19
  { type: 'boolean' }
20
20
  },
21
- 'ReeMapper::Float' => ->(*) {
21
+ ReeMapper::Float => ->(*) {
22
22
  {
23
23
  type: 'number',
24
24
  format: 'float'
25
25
  }
26
26
  },
27
- 'ReeMapper::Array' => ->(type, build_serializer_schema) {
27
+ ReeMapper::Array => ->(type, build_serializer_schema) {
28
28
  {
29
29
  type: 'array',
30
30
  items: build_serializer_schema.(type.of.type)
31
31
  }
32
32
  },
33
- 'ReeMapper::DateTime' => ->(*) {
33
+ ReeMapper::DateTime => ->(*) {
34
34
  {
35
35
  type: 'string',
36
36
  format: 'date-time'
37
37
  }
38
38
  },
39
- 'ReeMapper::Date' => ->(*) {
39
+ ReeMapper::Date => ->(*) {
40
40
  {
41
41
  type: 'string',
42
42
  format: 'date'
43
43
  }
44
44
  },
45
- 'ReeMapper::Time' => ->(*) {
45
+ ReeMapper::Time => ->(*) {
46
46
  {
47
47
  type: 'string',
48
48
  format: 'date-time'
@@ -50,40 +50,40 @@ class ReeSwagger::TypeDefinitionsRepo
50
50
  }
51
51
  },
52
52
  casters: {
53
- 'ReeMapper::Integer' => ->(*) {
53
+ ReeMapper::Integer => ->(*) {
54
54
  { type: 'integer' }
55
55
  },
56
- 'ReeMapper::String' => ->(*) {
56
+ ReeMapper::String => ->(*) {
57
57
  { type: 'string' }
58
58
  },
59
- 'ReeMapper::Bool' => ->(*) {
59
+ ReeMapper::Bool => ->(*) {
60
60
  { type: 'boolean' }
61
61
  },
62
- 'ReeMapper::Float' => ->(*) {
62
+ ReeMapper::Float => ->(*) {
63
63
  {
64
64
  type: 'number',
65
65
  format: 'float'
66
66
  }
67
67
  },
68
- 'ReeMapper::Array' => ->(type, build_caster_schema) {
68
+ ReeMapper::Array => ->(type, build_caster_schema) {
69
69
  {
70
70
  type: 'array',
71
71
  items: build_caster_schema.(type.of.type)
72
72
  }
73
73
  },
74
- 'ReeMapper::DateTime' => ->(*) {
74
+ ReeMapper::DateTime => ->(*) {
75
75
  {
76
76
  type: 'string',
77
77
  format: 'date-time'
78
78
  }
79
79
  },
80
- 'ReeMapper::Date' => ->(*) {
80
+ ReeMapper::Date => ->(*) {
81
81
  {
82
82
  type: 'string',
83
83
  format: 'date'
84
84
  }
85
85
  },
86
- 'ReeMapper::Time' => ->(*) {
86
+ ReeMapper::Time => ->(*) {
87
87
  {
88
88
  type: 'string',
89
89
  format: 'date-time'
@@ -1,5 +1,8 @@
1
1
  class ReeSwagger::EndpointDto
2
2
  include ReeDto::EntityDSL
3
+ include Ree::LinkDSL
4
+
5
+ link 'ree_swagger/dto/error_dto', -> { ErrorDto }
3
6
 
4
7
  properties(
5
8
  method: Or[:get, :post, :put, :patch, :delete],
@@ -8,6 +11,7 @@ class ReeSwagger::EndpointDto
8
11
  serializer: Nilor[ReeMapper::Mapper],
9
12
  description: Nilor[String],
10
13
  response_status: Integer,
11
- response_description: Nilor[String]
14
+ response_description: Nilor[String],
15
+ errors: ArrayOf[ErrorDto]
12
16
  )
13
17
  end
@@ -0,0 +1,9 @@
1
+
2
+ class ReeSwagger::ErrorDto
3
+ include ReeDto::EntityDSL
4
+
5
+ properties(
6
+ status: Integer,
7
+ description: String,
8
+ )
9
+ end
@@ -88,6 +88,17 @@ class ReeSwagger::BuildEndpointSchema
88
88
  endpoint.response_status => response_schema
89
89
  }
90
90
 
91
+ endpoint.errors.each do |error|
92
+ if responses.key?(error.status)
93
+ responses[error.status][:description] += "\n- #{error.description}"
94
+ next
95
+ end
96
+
97
+ responses[error.status] = {
98
+ description: "- #{error.description}",
99
+ }
100
+ end
101
+
91
102
  method_schema = {
92
103
  responses: responses
93
104
  }
@@ -10,7 +10,7 @@ class ReeSwagger::GetCasterDefinition
10
10
  contract(Any, Proc => Nilor[Hash])
11
11
  def call(type, schema_builder)
12
12
  type_definitions_repo
13
- .dig(:casters, type.class.name)
13
+ .dig(:casters, type.class)
14
14
  &.(type, schema_builder)
15
15
  end
16
16
  end
@@ -10,7 +10,7 @@ class ReeSwagger::GetSerializerDefinition
10
10
  contract(Any, Proc => Nilor[Hash])
11
11
  def call(type, build_serializer_schema)
12
12
  type_definitions_repo
13
- .dig(:serializers, type.class.name)
13
+ .dig(:serializers, type.class)
14
14
  &.(type, build_serializer_schema)
15
15
  end
16
16
  end
@@ -12,7 +12,7 @@ class ReeSwagger::RegisterType
12
12
  contract(Or[:casters, :serializers], Any, Proc => nil)
13
13
  def call(kind, type, definition)
14
14
  SEMAPHORE.synchronize do
15
- type_definitions_repo[kind][type.name] = definition
15
+ type_definitions_repo[kind][type] = definition
16
16
  end
17
17
 
18
18
  nil
@@ -5,5 +5,6 @@ module ReeSwagger
5
5
  depends_on :ree_mapper
6
6
  depends_on :ree_dto
7
7
  depends_on :ree_hash
8
+ depends_on :ree_enum
8
9
  end
9
10
  end
@@ -3,6 +3,14 @@ RSpec.describe :build_endpoint_schema do
3
3
  link :build_mapper_factory, from: :ree_mapper
4
4
  link :build_mapper_strategy, from: :ree_mapper
5
5
 
6
+ before :all do
7
+ Ree.enable_irb_mode
8
+ end
9
+
10
+ after :all do
11
+ Ree.disable_irb_mode
12
+ end
13
+
6
14
  let(:mapper_factory) {
7
15
  strategies = [
8
16
  build_mapper_strategy(method: :serialize, output: :symbol_key_hash),
@@ -15,6 +23,27 @@ RSpec.describe :build_endpoint_schema do
15
23
  }
16
24
 
17
25
  it {
26
+ module ReeSwaggerTest
27
+ include Ree::PackageDSL
28
+
29
+ package
30
+
31
+ class Locales
32
+ include ReeEnum::DSL
33
+
34
+ enum :locales
35
+
36
+ val :en, 0
37
+ val :ru, 1
38
+ end
39
+ end
40
+
41
+ mapper_factory.register_type(
42
+ :locales, ReeSwaggerTest::Locales.type_for_mapper
43
+ )
44
+
45
+ ReeSwaggerTest::Locales.register_as_swagger_type
46
+
18
47
  serializer = mapper_factory.call.use(:serialize) do
19
48
  integer :id
20
49
  end
@@ -28,6 +57,7 @@ RSpec.describe :build_endpoint_schema do
28
57
  integer :id
29
58
  string :name
30
59
  tag :tag
60
+ locales :locale
31
61
  end
32
62
 
33
63
  schema = build_endpoint_schema(ReeSwagger::EndpointDto.new(
@@ -36,7 +66,21 @@ RSpec.describe :build_endpoint_schema do
36
66
  caster: caster,
37
67
  serializer: serializer,
38
68
  response_status: 200,
39
- description: nil
69
+ description: nil,
70
+ errors: [
71
+ ReeSwagger::ErrorDto.new(
72
+ status: 400,
73
+ description: "1st 400 error"
74
+ ),
75
+ ReeSwagger::ErrorDto.new(
76
+ status: 400,
77
+ description: "2nd 400 error"
78
+ ),
79
+ ReeSwagger::ErrorDto.new(
80
+ status: 401,
81
+ description: "401 error"
82
+ )
83
+ ]
40
84
  ))
41
85
 
42
86
  expect(schema).to eq(ReeSwagger::PathDto.new(
@@ -64,6 +108,10 @@ RSpec.describe :build_endpoint_schema do
64
108
  name: { type: 'string' },
65
109
  value: { type: 'string' }
66
110
  }
111
+ },
112
+ locale: {
113
+ type: 'string',
114
+ enum: ['en', 'ru']
67
115
  }
68
116
  }
69
117
  }
@@ -83,6 +131,13 @@ RSpec.describe :build_endpoint_schema do
83
131
  }
84
132
  }
85
133
  }
134
+ },
135
+ 400 => {
136
+ description: "- 1st 400 error\n- 2nd 400 error",
137
+
138
+ },
139
+ 401 => {
140
+ description: "- 401 error",
86
141
  }
87
142
  }
88
143
  }
@@ -109,7 +164,8 @@ RSpec.describe :build_endpoint_schema do
109
164
  caster: caster,
110
165
  serializer: nil,
111
166
  response_status: 200,
112
- description: nil
167
+ description: nil,
168
+ errors: []
113
169
  ))
114
170
 
115
171
  expect(schema).to eq(ReeSwagger::PathDto.new(
@@ -167,7 +223,8 @@ RSpec.describe :build_endpoint_schema do
167
223
  caster: nil,
168
224
  serializer: nil,
169
225
  response_status: 200,
170
- description: nil
226
+ description: nil,
227
+ errors: []
171
228
  ))
172
229
  }.to raise_error(
173
230
  ReeSwagger::BuildEndpointSchema::MissingCasterError,
@@ -187,7 +244,8 @@ RSpec.describe :build_endpoint_schema do
187
244
  caster: caster,
188
245
  serializer: nil,
189
246
  response_status: 200,
190
- description: nil
247
+ description: nil,
248
+ errors: []
191
249
  ))
192
250
  }.to raise_error(
193
251
  ReeSwagger::BuildEndpointSchema::MissingCasterError,
@@ -12,7 +12,8 @@ RSpec.describe :build_schema do
12
12
  caster: nil,
13
13
  serializer: nil,
14
14
  response_status: 200,
15
- description: nil
15
+ description: nil,
16
+ errors: []
16
17
  )]
17
18
  )
18
19
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-23 00:00:00.000000000 Z
11
+ date: 2022-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -1120,6 +1120,7 @@ files:
1120
1120
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger.rb
1121
1121
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/beans/type_definitions_repo.rb
1122
1122
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/endpoint_dto.rb
1123
+ - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/error_dto.rb
1123
1124
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/dto/path_dto.rb
1124
1125
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_endpoint_schema.rb
1125
1126
  - lib/ree_lib/packages/ree_swagger/package/ree_swagger/functions/build_parameters.rb