jat 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18b7274ab643b613d2356e6f4704683d0ee17f6789fc3c01ba5c6435b09c0c84
4
- data.tar.gz: 197d92680d9bbe8610eca370516fc2b7a36bb7a6dfadf0a2fc75ce5e3959af90
3
+ metadata.gz: e4b14981546d524f665e1d268857bd8b2caafec9af07157a1f57fd2ca8f9c83c
4
+ data.tar.gz: 1335c436d0e4ae1f70fb70a9ef5757610e09ce3b5a03b87ba356d31625af0ab3
5
5
  SHA512:
6
- metadata.gz: f887b6f910f4677439e5842e4882eedb349e2bc6865e987b9dcec565dca83e20e13b2cf31eed117a332b1ae044c3194445f4241ba65c053c2b7adbba4ceb316d
7
- data.tar.gz: 9562212be2cacf78f9e6e166ca25d7eddfd995d15d16470b1b39cdd0e0cec33d8ffe14b912b4331d51079a6b16b76dd45f4cb2b9d7f74b3ebbab7dbcca202cee
6
+ metadata.gz: fcaccbe3cb5e5a27cd5700e3677886fb9966ef8ce2775bf2be6638578489747b8a488acbd3f6f7f55752323c40bc92410af1d079dfeefe2d4b41d4f768fbfbfb
7
+ data.tar.gz: 23a2cbda699f9e8f2a9588dc8cfb4350bbd1a1994603577bd3649a356148ad88d2bd754529bb63905aba59a993cc747c2e5ad762038fb571d5d83b1ecc6d40b4
data/lib/jat/config.rb CHANGED
@@ -1,23 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "forwardable"
3
4
  require_relative "utils/enum_deep_dup"
4
5
 
5
6
  class Jat
6
7
  class Config
7
8
  module InstanceMethods
9
+ extend Forwardable
10
+
8
11
  attr_reader :opts
9
12
 
10
13
  def initialize(opts = {})
11
14
  @opts = EnumDeepDup.call(opts)
12
15
  end
13
16
 
14
- def []=(key, value)
15
- opts[key] = value
16
- end
17
-
18
- def [](key)
19
- opts[key]
20
- end
17
+ def_delegators :@opts, :[], :[]=, :fetch
21
18
  end
22
19
 
23
20
  module ClassMethods
@@ -87,7 +87,7 @@ class Jat
87
87
  attributes.each do |name, attribute|
88
88
  next if data.key?(name)
89
89
 
90
- value = attribute_value(attribute)
90
+ value = attribute.value(object, context)
91
91
 
92
92
  unless value.nil?
93
93
  data = data.dup if data.equal?(FROZEN_EMPTY_HASH)
@@ -98,10 +98,6 @@ class Jat
98
98
  data
99
99
  end
100
100
 
101
- def attribute_value(attribute)
102
- attribute.block.call(object, context)
103
- end
104
-
105
101
  def context_jsonapi
106
102
  context_attr_transform(:jsonapi)
107
103
  end
@@ -60,7 +60,7 @@ class Jat
60
60
 
61
61
  attributes_names.each_with_object({}) do |name, attrs|
62
62
  attribute = jat_class.attributes[name]
63
- attrs[name] = attribute.block.call(object, context)
63
+ attrs[name] = attribute.value(object, context)
64
64
  end
65
65
  end
66
66
 
@@ -70,7 +70,7 @@ class Jat
70
70
 
71
71
  relationships_names.each_with_object({}) do |name, rels|
72
72
  rel_attribute = jat_class.attributes[name]
73
- rel_object = rel_attribute.block.call(object, context)
73
+ rel_object = rel_attribute.value(object, context)
74
74
 
75
75
  rel_serializer = rel_attribute.serializer.call
76
76
  rel_links = get_relationship_links(rel_serializer, rel_object)
@@ -123,14 +123,14 @@ class Jat
123
123
  def get_links
124
124
  jat_class
125
125
  .object_links
126
- .transform_values { |attr| attr.block.call(object, context) }
126
+ .transform_values { |attr| attr.value(object, context) }
127
127
  .tap(&:compact!)
128
128
  end
129
129
 
130
130
  def get_meta
131
131
  jat_class
132
132
  .added_object_meta
133
- .transform_values { |attr| attr.block.call(object, context) }
133
+ .transform_values { |attr| attr.value(object, context) }
134
134
  .tap(&:compact!)
135
135
  end
136
136
 
@@ -141,7 +141,7 @@ class Jat
141
141
  context[:parent_object] = object
142
142
 
143
143
  links
144
- .transform_values { |attr| attr.block.call(rel_object, context) }
144
+ .transform_values { |attr| attr.value(rel_object, context) }
145
145
  .tap(&:compact!)
146
146
  .tap { context.delete(:parent_object) }
147
147
  end
@@ -153,7 +153,7 @@ class Jat
153
153
  context[:parent_object] = object
154
154
 
155
155
  meta
156
- .transform_values { |attr| attr.block.call(rel_object, context) }
156
+ .transform_values { |attr| attr.value(rel_object, context) }
157
157
  .tap(&:compact!)
158
158
  .tap { context.delete(:parent_object) }
159
159
  end
@@ -163,7 +163,7 @@ class Jat
163
163
  end
164
164
 
165
165
  def id
166
- @id ||= jat_class.get_id.block.call(object, context)
166
+ @id ||= jat_class.get_id.value(object, context)
167
167
  end
168
168
  end
169
169
 
@@ -95,7 +95,7 @@ class Jat
95
95
  meta.each do |name, attribute|
96
96
  next if data.key?(name)
97
97
 
98
- value = attribute_value(attribute)
98
+ value = attribute.value(object, context)
99
99
 
100
100
  unless value.nil?
101
101
  data = data.dup if data.equal?(FROZEN_EMPTY_HASH)
@@ -109,10 +109,6 @@ class Jat
109
109
  def context_metadata
110
110
  context[:meta]&.transform_keys(&:to_sym) || FROZEN_EMPTY_HASH
111
111
  end
112
-
113
- def attribute_value(attribute)
114
- attribute.block.call(object, context)
115
- end
116
112
  end
117
113
 
118
114
  extend ClassMethods
@@ -37,7 +37,7 @@ class Jat
37
37
 
38
38
  map.each do |key, inner_map|
39
39
  attribute = jat_class.attributes.fetch(key)
40
- value = attribute_value(attribute)
40
+ value = attribute.value(object, context)
41
41
 
42
42
  result[key] =
43
43
  if attribute.relation?
@@ -56,10 +56,6 @@ class Jat
56
56
 
57
57
  private
58
58
 
59
- def attribute_value(attribute)
60
- attribute.block.call(object, context)
61
- end
62
-
63
59
  def inner_piece(attribute, value, inner_map)
64
60
  serializer = attribute.serializer.call
65
61
  serializer::ResponsePiece.to_h(value, context, inner_map)
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Jat
4
+ module Plugins
5
+ module Types
6
+ def self.plugin_name
7
+ :types
8
+ end
9
+
10
+ def self.load(jat_class, **_opts)
11
+ jat_class::Attribute.include(InstanceMethods)
12
+ end
13
+
14
+ def self.after_load(jat_class, **_opts)
15
+ jat_class.config[:types] = {
16
+ array: ->(value) { Array(value) },
17
+ bool: ->(value) { !!value },
18
+ float: ->(value) { Float(value) },
19
+ hash: ->(value) { Hash(value) },
20
+ int: ->(value) { Integer(value) },
21
+ str: ->(value) { String(value) }
22
+ }
23
+ end
24
+
25
+ module InstanceMethods
26
+ def block
27
+ return @block if instance_variable_defined?(:@block)
28
+
29
+ original_block = super
30
+ type = opts[:type]
31
+ return original_block unless type
32
+
33
+ @block = typed_block(type, original_block)
34
+ end
35
+
36
+ private
37
+
38
+ def typed_block(type, original_block)
39
+ proc do |object, context|
40
+ value = original_block.call(object, context)
41
+
42
+ # Type conversion
43
+ case type
44
+ when Symbol then self.class.jat_class.config.fetch(:types).fetch(type).call(value)
45
+ else type.call(value)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ register_plugin(Types.plugin_name, Types)
53
+ end
54
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::Types" do
6
+ let(:struct) { Struct.new(:attr) }
7
+ let(:obj) { struct.new(nil) }
8
+
9
+ let(:jat_class) do
10
+ new_class = Class.new(Jat)
11
+ new_class.plugin(:types)
12
+ new_class
13
+ end
14
+
15
+ def attr_value(original_value)
16
+ obj = struct.new(original_value)
17
+ jat_class.attributes[:attr].value(obj, nil)
18
+ end
19
+
20
+ it "has predefined :int type" do
21
+ jat_class.attribute(:attr, type: :int)
22
+
23
+ assert_equal(0, attr_value("0"))
24
+ assert_equal(8, attr_value("010")) # octal system
25
+ assert_equal(10, attr_value("0xa")) # hexadecimal system
26
+ end
27
+
28
+ it "has predefined :bool type" do
29
+ jat_class.attribute(:attr, type: :bool)
30
+
31
+ assert_equal(false, attr_value(nil))
32
+ assert_equal(false, attr_value(false))
33
+ assert_equal(true, attr_value(1))
34
+ end
35
+
36
+ it "has predefined :float type" do
37
+ jat_class.attribute(:attr, type: :float)
38
+
39
+ assert_same(0.0, attr_value("0"))
40
+ assert_same(0.001, attr_value("1e-3"))
41
+ assert_same(1.234, attr_value("1.234"))
42
+ end
43
+
44
+ it "has predefined :array type" do
45
+ jat_class.attribute(:attr, type: :array)
46
+
47
+ assert_equal([1], attr_value(1))
48
+ assert_equal([1], attr_value([1]))
49
+ end
50
+
51
+ it "has predefined :hash type" do
52
+ jat_class.attribute(:attr, type: :hash)
53
+
54
+ assert_equal({}, attr_value([]))
55
+ assert_equal({}, attr_value({}))
56
+ assert_equal({key: :value}, attr_value(key: :value))
57
+ end
58
+
59
+ it "has predefined :str type" do
60
+ jat_class.attribute(:attr, type: :str)
61
+
62
+ assert_equal("", attr_value(nil))
63
+ assert_equal("123", attr_value(123))
64
+ end
65
+
66
+ it "allows to use callable method as type" do
67
+ jat_class.attribute(:attr, type: ->(obj) { obj ? :yes : :no })
68
+
69
+ assert_equal(:no, attr_value(nil))
70
+ assert_equal(:yes, attr_value(1))
71
+ end
72
+
73
+ it "allows to configure custom type" do
74
+ jat_class.config[:types][:year] = ->(obj) { obj.strftime("%Y") }
75
+ jat_class.attribute(:attr, type: :year)
76
+
77
+ assert_equal("2020", attr_value(Time.new(2020, 10, 10)))
78
+ end
79
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Glushkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-06 00:00:00.000000000 Z
11
+ date: 2022-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '6.0'
89
+ version: '7.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '6.0'
96
+ version: '7.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -166,6 +166,7 @@ files:
166
166
  - lib/jat/plugins/simple_api/plugins/simple_api_validate_params/simple_api_validate_params.rb
167
167
  - lib/jat/plugins/simple_api/simple_api.rb
168
168
  - lib/jat/plugins/to_str/to_str.rb
169
+ - lib/jat/plugins/types/types.rb
169
170
  - lib/jat/plugins/validate_params/validate_params.rb
170
171
  - lib/jat/utils/enum_deep_dup.rb
171
172
  - lib/jat/utils/enum_deep_freeze.rb
@@ -200,6 +201,7 @@ files:
200
201
  - test/lib/jat/plugins/simple_api_preloads/simple_api_preloads_test.rb
201
202
  - test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb
202
203
  - test/lib/jat/plugins/to_str/to_str_test.rb
204
+ - test/lib/jat/plugins/types/types_test.rb
203
205
  - test/lib/jat/utils/enum_deep_dup_test.rb
204
206
  - test/lib/jat/utils/enum_deep_freeze_test.rb
205
207
  - test/lib/jat_test.rb
@@ -265,6 +267,7 @@ test_files:
265
267
  - test/lib/jat/plugins/simple_api_preloads/simple_api_preloads_test.rb
266
268
  - test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb
267
269
  - test/lib/jat/plugins/to_str/to_str_test.rb
270
+ - test/lib/jat/plugins/types/types_test.rb
268
271
  - test/lib/jat/utils/enum_deep_dup_test.rb
269
272
  - test/lib/jat/utils/enum_deep_freeze_test.rb
270
273
  - test/lib/jat_test.rb