purple-client 0.1.7.2 → 0.1.7.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: 69afc0be89db74d4a3b76af2c93c31652ba2443491f5e9c20303e263cb3075d5
4
- data.tar.gz: de1de5487aeca7098cda9d761f026b988c3d2ee7b77d2bd0c5737467ca80bb47
3
+ metadata.gz: '08cd363a5b6e96500dde9beaa81ac46fdb282d6e6225d8ca19d4ba917c0b6f4f'
4
+ data.tar.gz: 3eb93db2b0b359bc7b455ce6282bcc02d1d50991fbd8578a0527388b785fd9e8
5
5
  SHA512:
6
- metadata.gz: 66fd354ebdab532ca2a35b3972eb2a7d6a8d49d1fd764b0f61e3629d9032338ca117de2240c73d26e140a6e0b31e96223cbf6d701d56ec71b1eab5f0b0e2030b
7
- data.tar.gz: 79fe2ed7920d8115ffb53bde9a2619604df8e9a981e70b83096839b2fd898381747d5f42736644e87d5f63d36c7377dd4110b9332d486900c06a9dd94a8d16e8
6
+ metadata.gz: 2653930ab7bcb2855c8ff142d401ffb8b1c676f0ca579f66fb7a780f8cb45760afff1f7f60fbabe7573091c4a877e6e5ea4d8d31d26c9dafd41a8c4d2b953095
7
+ data.tar.gz: f2aacc6f3e1d6ca9b6661c5ad08be55f29b12061e1b037d30aca40ef7bb397ebb2b6ef88e6df772e66abf8bb7b61d6247d7d1980b35009d9f759d3bbd48504b5
data/README.md CHANGED
@@ -174,6 +174,58 @@ class AccountsClient < Purple::Client
174
174
  end
175
175
  ```
176
176
 
177
+ ### Optional fields
178
+
179
+ Sometimes an API response omits certain keys. You can mark those fields as
180
+ optional in the body definition so their absence doesn't raise validation errors.
181
+
182
+ ```ruby
183
+ class CalendarClient < Purple::Client
184
+ domain 'https://api.example.com'
185
+
186
+ path :schedule do
187
+ response :ok do
188
+ body(
189
+ day: { type: Integer, optional: true },
190
+ )
191
+ end
192
+ root_method :schedule
193
+ end
194
+ end
195
+
196
+ # The `day` attribute may be missing in the response
197
+ CalendarClient.schedule
198
+ ```
199
+
200
+ ### Array responses
201
+
202
+ When an endpoint returns an array of objects, you can use `:array_of` to
203
+ describe the structure of each element in the array.
204
+
205
+ ```ruby
206
+ class MerchantsClient < Purple::Client
207
+ domain 'https://api.example.com'
208
+
209
+ path :merchants do
210
+ response :ok do
211
+ structure = {
212
+ id: Integer,
213
+ name: String,
214
+ address: String,
215
+ work_time: String,
216
+ accepts_qr: { type: String, optional: true }
217
+ }
218
+
219
+ body(:array_of, **structure)
220
+ end
221
+ root_method :merchants
222
+ end
223
+ end
224
+
225
+ # Each array element will be validated against the structure
226
+ MerchantsClient.merchants
227
+ ```
228
+
177
229
  ## Development
178
230
 
179
231
  After checking out the repo, run `bin/setup` to install dependencies. Then run
@@ -0,0 +1,7 @@
1
+ require_relative '../version'
2
+
3
+ module Purple
4
+ class Client
5
+ VERSION = Purple::VERSION
6
+ end
7
+ end
data/lib/purple/client.rb CHANGED
@@ -6,7 +6,8 @@ require 'purple/requests/authorization'
6
6
  require 'purple/response'
7
7
  require 'purple/responses/body'
8
8
  require 'purple/boolean'
9
- require_relative "version"
9
+ require_relative 'version'
10
+ require_relative 'client/version'
10
11
 
11
12
  module Purple
12
13
  class Client
data/lib/purple/path.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'dry-initializer'
4
+ require 'faraday'
5
+ require 'active_support/core_ext/hash/deep_merge'
6
+ require 'active_support/core_ext/object/inclusion'
4
7
 
5
8
  module Purple
6
9
  class Path
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'purple/responses'
4
4
  require 'purple/responses/object'
5
+ require "active_support/core_ext/string/inflections"
5
6
 
6
7
  class Purple::Responses::Body
7
8
  extend Dry::Initializer[undefined: false]
@@ -75,6 +76,8 @@ class Purple::Responses::Body
75
76
 
76
77
  check_type!(object, key, value[:type])
77
78
  else
79
+ next if object[key].nil?
80
+
78
81
  check_structure!(object[key], substructure[key])
79
82
  end
80
83
  elsif value.is_a?(Array)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Purple returns objects as responses from API. This is a base class for all responses objects.
4
+ require 'active_support/core_ext/module/delegation'
4
5
  class Purple::Responses::Object
5
6
  attr_accessor :attributes
6
7
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Purple
4
- VERSION = "0.1.7.2"
4
+ VERSION = "0.1.7.3"
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.2
4
+ version: 0.1.7.3
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-07-08 00:00:00.000000000 Z
11
+ date: 2025-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-initializer
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  description: Build API wrappers faster
28
56
  email:
29
57
  - kalashnikovisme@gmail.com
@@ -40,6 +68,7 @@ files:
40
68
  - Rakefile
41
69
  - lib/purple/boolean.rb
42
70
  - lib/purple/client.rb
71
+ - lib/purple/client/version.rb
43
72
  - lib/purple/path.rb
44
73
  - lib/purple/request.rb
45
74
  - lib/purple/requests/authorization.rb