purple-client 0.1.7.7 → 0.1.8

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: d7ca49130cf7c540423e3b62726ca82034f7a7b93e0abcf6a727243be2950ee3
4
- data.tar.gz: 5d3650ca03866747031cb9f6da5ebc2c56abb69a26e3a73763b6e40295b98782
3
+ metadata.gz: 904a3aae97dec86b01cba57ebe806b9745cbce75803e986e63ae953209642455
4
+ data.tar.gz: 92397c8c6a2862fd4366d58dd67bc255933252d91becad2af58241ed1a0e3234
5
5
  SHA512:
6
- metadata.gz: 6335d77f00653b8f0bd086dc7662c5496fd98910488daed8a9a23f2a6fb7c1134bcdfd9d0c9e7ced41adb06244072bef73e0f230202a6e1b21f77d5539b3d7ee
7
- data.tar.gz: b317e1acdb851ac1de738047b9e141ab2aa7a9d79bee1567893bc98e981849d47b7f04757aa3aa813f11f1e265a636eaa0b4bccb7d4b59f27d4ee27a15ca8373
6
+ metadata.gz: 7072c78039ce88e59465cd91950eca347c11e876639490235f354ff5e8fad4cef31a84128c4b90ab28b6efd107bea3b91620f27f03c1ad19f06744803268510f
7
+ data.tar.gz: 6fa661c3de144a83de31fc3cdcdbd199ea6fd3d38643d2b60bbb4e243893074adaa19b6bc5daf7118b1a5339bb754d9fc3d1c809e09af7006281cb465177b7ae
data/lib/purple/path.rb CHANGED
@@ -4,6 +4,7 @@ require 'dry-initializer'
4
4
  require 'faraday'
5
5
  require 'active_support/core_ext/hash/deep_merge'
6
6
  require 'active_support/core_ext/object/inclusion'
7
+ require 'active_support/core_ext/object/blank'
7
8
 
8
9
  module Purple
9
10
  class Path
@@ -20,29 +20,29 @@ class Purple::Responses::Body
20
20
  def validate!(body, arguments)
21
21
  parsed_body = JSON.parse(body, symbolize_names: true)
22
22
 
23
- result = if parsed_body.is_a? Integer
24
- parsed_body
25
- else
26
- underscored_body = if parsed_body.is_a? Array
27
- parsed_body.map { |item| item.transform_keys { |key| key.to_s.underscore.to_sym } }
28
- else
29
- parsed_body.transform_keys { |key| key.to_s.underscore.to_sym }
30
- end
31
-
32
- if underscored_body.is_a? Array
33
- underscored_body.each do |item|
34
- check_structure!(item)
35
- end
36
- else
37
- check_structure!(underscored_body)
38
- end
39
-
40
- if underscored_body.is_a?(Array)
41
- underscored_body.map { |item| create_object(item) }
42
- else
43
- create_object(underscored_body)
44
- end
45
- end
23
+ if parsed_body.is_a? Integer
24
+ parsed_body
25
+ else
26
+ underscored_body = if parsed_body.is_a? Array
27
+ parsed_body.map { |item| item.transform_keys { |key| key.to_s.underscore.to_sym } }
28
+ else
29
+ parsed_body.transform_keys { |key| key.to_s.underscore.to_sym }
30
+ end
31
+
32
+ if underscored_body.is_a? Array
33
+ underscored_body.each do |item|
34
+ check_structure!(item)
35
+ end
36
+ else
37
+ check_structure!(underscored_body)
38
+ end
39
+
40
+ if underscored_body.is_a?(Array)
41
+ underscored_body.map { |item| create_klass(item, structure) }
42
+ else
43
+ create_klass(underscored_body, structure)
44
+ end
45
+ end => result
46
46
 
47
47
  if transform.is_a?(Proc)
48
48
  transform.call(result, arguments)
@@ -55,16 +55,24 @@ class Purple::Responses::Body
55
55
 
56
56
  private
57
57
 
58
- def create_object(body)
59
- object = Class.new(Purple::Responses::Object) do
58
+ def create_klass(body, structure)
59
+ klass = Class.new(Purple::Responses::Object) do
60
60
  body.each do |key, value|
61
61
  define_method(key) { value }
62
62
  end
63
+
64
+ structure.each do |key, value|
65
+ if value.is_a?(Hash) && value[:optional] == true && !body.key?(key)
66
+ define_method(key) do
67
+ raise NoMethodError, "Optional field '#{key}' is not present in the response body. Use `contain?(:#{key})` to check its presence."
68
+ end
69
+ end
70
+ end
63
71
  end.new
64
72
 
65
- object.attributes = body
73
+ klass.attributes = body
66
74
 
67
- object
75
+ klass
68
76
  end
69
77
 
70
78
  def check_structure!(object, substructure = structure)
@@ -6,4 +6,8 @@ class Purple::Responses::Object
6
6
  attr_accessor :attributes
7
7
 
8
8
  delegate :to_s, to: :attributes
9
+
10
+ def contain?(key)
11
+ attributes.key?(key)
12
+ end
9
13
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Purple
4
- VERSION = "0.1.7.7"
4
+ VERSION = "0.1.8"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: purple-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Kalashnikov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-09-03 00:00:00.000000000 Z
11
+ date: 2025-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-initializer