datory 1.0.0.rc2 → 1.0.0.rc3

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: dad592cd7b60ed42e5e729fc785dfcb148abff2e4966194563d943f9e3f66f60
4
- data.tar.gz: 9bffee76ef163ac26529c4a163afa2e1a9cea42da6619381b85d7cd2b5187290
3
+ metadata.gz: 8562a68170d39d6d97a80eceae372d7f043cbb08db2890faa2d6d22a792748bf
4
+ data.tar.gz: 89ef0b5c9a73289a3567e01202a9a83beeaefee6db2f084168c6e755da4e3044
5
5
  SHA512:
6
- metadata.gz: fe6407e48e97f7e2f462e52cc7aba7a1726171f02e9fcd1d774bb36c9b04047abdf7218a3eede1b99023fe38f16d80b7bbec224313ffc229e3695b8bdc6126e3
7
- data.tar.gz: ae3835273961a84951d232afccf50851cade4f9efb5f89c44d8d7cdf55b3804ff6ba983580d4025aa4f6fd28fd4f695d1941fb74833015d3a88852712d4332fa
6
+ metadata.gz: 3c6ed842a16e265979fc1d5ebc4b517390884bac7118500d39cc48d6b180c7c842b08cadfdf853db111b2a56a8c016cbcbf9654d4b290272399f461d9eec48ba
7
+ data.tar.gz: 6428856321dd65efb127aca09955e5e34eb1d3cff3cdc2f8da0fd669e4556582ecef976919b60f6808ce84a602a9dc60f332ffcc42b0421c613b0dc43d1ff429
@@ -29,6 +29,11 @@ module Datory
29
29
  collection_of_attributes << Attribute.new(name, **options)
30
30
  end
31
31
 
32
+ def symbol(name, **options)
33
+ options = options.merge(type: Symbol)
34
+ attribute(name, **options)
35
+ end
36
+
32
37
  def string(name, **options)
33
38
  options = options.merge(type: String)
34
39
  attribute(name, **options)
@@ -0,0 +1,52 @@
1
+ module Datory
2
+ module Attributes
3
+ module Serialization
4
+ class Serializator
5
+ def self.serialize(model:, collection_of_attributes:)
6
+ new(collection_of_attributes: collection_of_attributes).serialize(model: model)
7
+ end
8
+
9
+ def initialize(collection_of_attributes:)
10
+ @collection_of_attributes = collection_of_attributes
11
+ end
12
+
13
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
14
+ def serialize(model:)
15
+ if [Set, Array].include?(model.class)
16
+ model.map do |nested_model|
17
+ serialize(model: nested_model)
18
+ end
19
+ else
20
+ @collection_of_attributes.to_h do |attribute|
21
+ internal_name = attribute.options.fetch(:as, attribute.name)
22
+ include_class = attribute.options.fetch(:include, nil)
23
+ output_formatter = attribute.options.fetch(:output, nil)
24
+
25
+ value = model.public_send(internal_name)
26
+
27
+ value =
28
+ if include_class.present?
29
+ type = attribute.options.fetch(:type, nil)
30
+
31
+ if [Set, Array].include?(type)
32
+ value.map { |item| include_class.serialize(item) }
33
+ else
34
+ include_class.serialize(value)
35
+ end
36
+ elsif output_formatter.is_a?(Proc)
37
+ output_formatter.call(value: value)
38
+ elsif [Date, Time, DateTime].include?(value.class)
39
+ value.to_s
40
+ else
41
+ value
42
+ end
43
+
44
+ [attribute.name, value]
45
+ end
46
+ end
47
+ end
48
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datory
4
+ module Attributes
5
+ module Tools
6
+ class ServiceBuilder
7
+ SERVICE_CLASS_NAME = "Builder"
8
+
9
+ def self.build!(...)
10
+ new(...).build!
11
+ end
12
+
13
+ def initialize(context, incoming_attributes, collection_of_attributes)
14
+ @context = context
15
+ @incoming_attributes = incoming_attributes
16
+ @collection_of_attributes = collection_of_attributes
17
+ end
18
+
19
+ def build!
20
+ ServiceFactory.create(@context.class, @collection_of_attributes)
21
+
22
+ builder_class.call!(**@incoming_attributes)
23
+ end
24
+
25
+ private
26
+
27
+ def builder_class
28
+ "#{@context.class.name}::#{SERVICE_CLASS_NAME}".constantize
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datory
4
+ module Attributes
5
+ module Tools
6
+ class ServiceFactory
7
+ def self.create(...)
8
+ new(...).create
9
+ end
10
+
11
+ def initialize(model_class, collection_of_attributes)
12
+ @model_class = model_class
13
+ @collection_of_attributes = collection_of_attributes
14
+ end
15
+
16
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
17
+ def create
18
+ return if @model_class.const_defined?(ServiceBuilder::SERVICE_CLASS_NAME)
19
+
20
+ collection_of_attributes = @collection_of_attributes
21
+
22
+ class_sample = Class.new(Datory::Service::Builder) do
23
+ collection_of_attributes.each do |attribute| # rubocop:disable Metrics/BlockLength
24
+ input_internal_name = attribute.options.fetch(:as, attribute.name)
25
+
26
+ input attribute.name,
27
+ as: input_internal_name,
28
+ type: attribute.options.fetch(:type),
29
+ required: attribute.options.fetch(:required, true),
30
+ consists_of: attribute.options.fetch(:consists_of, false),
31
+ prepare: (lambda do |value:|
32
+ include_class = attribute.options.fetch(:include, nil)
33
+ return value unless include_class.present?
34
+
35
+ type = attribute.options.fetch(:type, nil)
36
+
37
+ if [Set, Array].include?(type)
38
+ value.map { |item| include_class.build(**item) }
39
+ else
40
+ include_class.build(**value)
41
+ end
42
+ end)
43
+
44
+ output input_internal_name,
45
+ consists_of: (
46
+ if (type = attribute.options.fetch(:consists_of, false)) == Hash
47
+ Datory::Result
48
+ else
49
+ type
50
+ end
51
+ ),
52
+ type: if (type = attribute.options.fetch(:type)) == Hash
53
+ Datory::Result
54
+ else
55
+ type
56
+ end
57
+
58
+ make :"assign_#{input_internal_name}_output"
59
+
60
+ define_method(:"assign_#{input_internal_name}_output") do
61
+ outputs.public_send(:"#{input_internal_name}=", inputs.public_send(input_internal_name))
62
+ end
63
+ end
64
+
65
+ # output :model, type: Class
66
+
67
+ # make :assign_model_name
68
+
69
+ # def assign_model_name
70
+ # model_class_name_array = self.class.name.split("::")
71
+ # model_class_name_array.pop
72
+ # model_class_name = model_class_name_array.join("::")
73
+ # model_class = model_class_name.constantize
74
+ #
75
+ # outputs.model = model_class
76
+ # end
77
+ end
78
+
79
+ @model_class.const_set(ServiceBuilder::SERVICE_CLASS_NAME, class_sample)
80
+ end
81
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
82
+ end
83
+ end
84
+ end
85
+ end
@@ -3,76 +3,12 @@
3
3
  module Datory
4
4
  module Attributes
5
5
  module Workspace
6
- class ServiceFactory
7
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
8
- def self.create(model_class, class_name, collection_of_attributes)
9
- return if model_class.const_defined?(class_name)
10
-
11
- class_sample = Class.new(Datory::Service::Builder) do
12
- collection_of_attributes.each do |attribute| # rubocop:disable Metrics/BlockLength
13
- input_internal_name = attribute.options.fetch(:as, attribute.name)
14
-
15
- input attribute.name,
16
- as: input_internal_name,
17
- type: attribute.options.fetch(:type),
18
- required: attribute.options.fetch(:required, true),
19
- consists_of: attribute.options.fetch(:consists_of, false),
20
- prepare: (lambda do |value:|
21
- include_class = attribute.options.fetch(:include, nil)
22
- return value unless include_class.present?
23
-
24
- type = attribute.options.fetch(:type, nil)
25
-
26
- if [Set, Array].include?(type)
27
- value.map { |item| include_class.build(**item) }
28
- else
29
- include_class.build(**value)
30
- end
31
- end)
32
-
33
- output input_internal_name,
34
- consists_of: (
35
- if (type = attribute.options.fetch(:consists_of, false)) == Hash
36
- Datory::Result
37
- else
38
- type
39
- end
40
- ),
41
- type: if (type = attribute.options.fetch(:type)) == Hash
42
- Datory::Result
43
- else
44
- type
45
- end
46
-
47
- make :"assign_#{input_internal_name}_output"
48
-
49
- define_method(:"assign_#{input_internal_name}_output") do
50
- outputs.public_send(:"#{input_internal_name}=", inputs.public_send(input_internal_name))
51
- end
52
- end
53
- end
54
-
55
- model_class.const_set(class_name, class_sample)
56
- end
57
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
58
- end
59
-
60
6
  private
61
7
 
62
8
  def build!(incoming_attributes:, collection_of_attributes:, **)
63
9
  super
64
10
 
65
- builder_class_name = "GBuilder"
66
-
67
- ServiceFactory.create(self.class, builder_class_name, collection_of_attributes)
68
-
69
- builder_class = "#{self.class.name}::#{builder_class_name}".constantize
70
-
71
- builder_class.call!(**incoming_attributes)
72
-
73
- # Tools::Unnecessary.find!(self, attributes, collection_of_attributes)
74
- # Tools::Rules.check!(self, collection_of_attributes)
75
- # Tools::Validation.validate!(self, attributes, collection_of_attributes)
11
+ Tools::ServiceBuilder.build!(self, incoming_attributes, collection_of_attributes)
76
12
  end
77
13
  end
78
14
  end
@@ -3,42 +3,12 @@
3
3
  module Datory
4
4
  module Context
5
5
  module Callable
6
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
7
6
  def serialize(model)
8
- if [Set, Array].include?(model.class)
9
- model.map do |model_item|
10
- serialize(model_item)
11
- end
12
- else
13
- collection_of_attributes.to_h do |attribute|
14
- internal_name = attribute.options.fetch(:as, attribute.name)
15
- include_class = attribute.options.fetch(:include, nil)
16
- output_formatter = attribute.options.fetch(:output, nil)
17
-
18
- value = model.public_send(internal_name)
19
-
20
- value =
21
- if include_class.present?
22
- type = attribute.options.fetch(:type, nil)
23
-
24
- if [Set, Array].include?(type)
25
- value.map { |item| include_class.serialize(item) }
26
- else
27
- include_class.serialize(value)
28
- end
29
- elsif output_formatter.is_a?(Proc)
30
- output_formatter.call(value: value)
31
- elsif [Date, Time, DateTime].include?(value.class)
32
- value.to_s
33
- else
34
- value
35
- end
36
-
37
- [attribute.name, value]
38
- end
39
- end
7
+ Datory::Attributes::Serialization::Serializator.serialize(
8
+ model: model,
9
+ collection_of_attributes: collection_of_attributes
10
+ )
40
11
  end
41
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
42
12
 
43
13
  def deserialize(json)
44
14
  if [Set, Array].include?(json.class)
@@ -5,7 +5,7 @@ module Datory
5
5
  MAJOR = 1
6
6
  MINOR = 0
7
7
  PATCH = 0
8
- PRE = "rc2"
8
+ PRE = "rc3"
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
11
11
  end
data/lib/datory.rb CHANGED
@@ -4,7 +4,7 @@ require "zeitwerk"
4
4
 
5
5
  require "active_support/all"
6
6
 
7
- require "uri"
7
+ require "servactory"
8
8
 
9
9
  loader = Zeitwerk::Loader.for_gem
10
10
  loader.inflector.inflect(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datory
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc2
4
+ version: 1.0.0.rc3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Sokolov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-21 00:00:00.000000000 Z
11
+ date: 2024-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -48,16 +48,16 @@ dependencies:
48
48
  name: servactory
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: '2.4'
53
+ version: 2.5.0.rc2
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: '2.4'
60
+ version: 2.5.0.rc2
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: zeitwerk
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +199,9 @@ files:
199
199
  - lib/datory/attributes/attribute.rb
200
200
  - lib/datory/attributes/collection.rb
201
201
  - lib/datory/attributes/dsl.rb
202
+ - lib/datory/attributes/serialization/serializator.rb
203
+ - lib/datory/attributes/tools/service_builder.rb
204
+ - lib/datory/attributes/tools/service_factory.rb
202
205
  - lib/datory/attributes/workspace.rb
203
206
  - lib/datory/base.rb
204
207
  - lib/datory/context/callable.rb