reynard 0.8.1 → 0.9.0

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: 2942c304a1a9caaae88253e2bce40188b79bb8a5d25ccd93c8e9a04f7730e386
4
- data.tar.gz: 12948419634f2926ae083ae364bd35f48a6b79b8f6308df95b80baafe061dce6
3
+ metadata.gz: 52cb53bbff626e0dce10485bf5cc023639b024024a237e34a73d09ae632ef9db
4
+ data.tar.gz: 1b66f322e4f7bfe5d0a5bd63096f218994bd55ed747a2fb2e1fa72c4af57ef30
5
5
  SHA512:
6
- metadata.gz: 2bcf669808d10dfff594861274b301ff77c99038ddea5e121b0ccd61336beb7089e6c20f4e566c9a29e5b813194f5b79d07c7c067c720b6b303de8c07e862944
7
- data.tar.gz: 64f7877a9a9e44c77cb357ff36d2ecac691cfce668dc2ba2197f0b68a284e0127fab96c099ca3cb99c0390658466a4fcda3569a2e2479e643d73f95d06cf2a16
6
+ metadata.gz: 15a3077ed0ee0c2331cab0182adae4b3970d83a4113f82d2d8aa4e528edd93678dd10a7e346d54e8d3e659dd5ad3509415f9de714a61a013e1937c3781eb686d
7
+ data.tar.gz: 80f49722dbde52f83aa9260aea1f71ccc6b97c7871f0818a71b4d42b4a79683cc404a0fa0ad8714f0d4fa4d3def54d2e140be1b35abe215699098da25c9b7b00
data/lib/reynard/model.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  class Reynard
4
4
  # Superclass for dynamic classes generated by the object builder.
5
- class Model
6
- extend Forwardable
7
- def_delegators :@attributes, :[]
5
+ class Model < BasicObject
6
+ extend ::Forwardable
7
+ def_delegators :@attributes, :[], :empty?
8
8
 
9
9
  class << self
10
10
  # Holds references to the full schema for the model if available.
@@ -14,9 +14,26 @@ class Reynard
14
14
  end
15
15
 
16
16
  def initialize(attributes)
17
- @attributes = {}
18
- @snake_cases = self.class.snake_cases(attributes.keys)
19
- self.attributes = attributes
17
+ if attributes.respond_to?(:each) && attributes.respond_to?(:keys)
18
+ @attributes = {}
19
+ @snake_cases = self.class.snake_cases(attributes.keys)
20
+ self.attributes = attributes
21
+ else
22
+ ::Kernel.raise(
23
+ ::ArgumentError,
24
+ self.class.attributes_error_message(attributes)
25
+ )
26
+ end
27
+ end
28
+
29
+ # We rely on these methods for various reasons so we re-introduce them at the expense of
30
+ # allowing them to be used as attribute name for the model.
31
+ %i[class is_a? nil? object_id kind_of? respond_to? send].each do |method|
32
+ define_method(method, ::Kernel.method(method))
33
+ end
34
+
35
+ def inspect
36
+ "#<#{self.class.name}:0x#{object_id.to_s(16)}>"
20
37
  end
21
38
 
22
39
  def attributes=(attributes)
@@ -27,14 +44,16 @@ class Reynard
27
44
 
28
45
  # Until we can set accessors based on the schema
29
46
  def method_missing(attribute_name, *)
47
+ return false unless @attributes
48
+
30
49
  attribute_name = attribute_name.to_s
31
50
  if @attributes.key?(attribute_name)
32
51
  @attributes[attribute_name]
33
52
  else
34
53
  @attributes.fetch(@snake_cases.fetch(attribute_name))
35
54
  end
36
- rescue KeyError
37
- raise NoMethodError, "undefined method `#{attribute_name}' for #{inspect}"
55
+ rescue ::KeyError
56
+ ::Kernel.raise ::NoMethodError, "undefined method `#{attribute_name}' for #{inspect}"
38
57
  end
39
58
 
40
59
  def respond_to_missing?(attribute_name, *)
@@ -42,21 +61,26 @@ class Reynard
42
61
  return true if @attributes.key?(attribute_name)
43
62
 
44
63
  @snake_cases.key?(attribute_name) && @attributes.key?(@snake_cases[attribute_name])
45
- rescue NameError
64
+ rescue ::NameError
46
65
  false
47
66
  end
48
67
 
68
+ def try(attribute_name)
69
+ respond_to_missing?(attribute_name) ? send(attribute_name) : nil
70
+ end
71
+
49
72
  def self.cast(name, value)
73
+ return if value.nil?
50
74
  return value unless schema
51
75
 
52
76
  property = schema.property_schema(name)
53
77
  return value unless property
54
78
 
55
- Reynard::ObjectBuilder.new(schema: property, inflector: inflector, parsed_body: value).call
79
+ ::Reynard::ObjectBuilder.new(schema: property, inflector: inflector, parsed_body: value).call
56
80
  end
57
81
 
58
82
  def self.inflector
59
- @inflector ||= Inflector.new
83
+ @inflector ||= ::Reynard::Inflector.new
60
84
  end
61
85
 
62
86
  def self.snake_cases(property_names)
@@ -67,5 +91,11 @@ class Reynard
67
91
  snake_cases[snake_case] = property_name
68
92
  end
69
93
  end
94
+
95
+ def self.attributes_error_message(attributes)
96
+ 'Models must be intialized with an enumerable object that behaves like a Hash, got: ' \
97
+ "`#{attributes.inspect}'. Usually this means the schema defined in the OpenAPI " \
98
+ "specification doesn't fit the payload in the HTTP response."
99
+ end
70
100
  end
71
101
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Reynard
4
- VERSION = '0.8.1'
4
+ VERSION = '0.9.0'
5
5
  end
data/lib/reynard.rb CHANGED
@@ -20,7 +20,6 @@ class Reynard
20
20
  autoload :GroupedParameters, 'reynard/grouped_parameters'
21
21
  autoload :Http, 'reynard/http'
22
22
  autoload :Inflector, 'reynard/inflector'
23
- autoload :Logger, 'reynard/logger'
24
23
  autoload :MediaType, 'reynard/media_type'
25
24
  autoload :Model, 'reynard/model'
26
25
  autoload :Models, 'reynard/models'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reynard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manfred Stienstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-14 00:00:00.000000000 Z
11
+ date: 2024-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  requirements: []
106
- rubygems_version: 3.3.7
106
+ rubygems_version: 3.5.6
107
107
  signing_key:
108
108
  specification_version: 4
109
109
  summary: Minimal OpenAPI client.