simpal 1.0.2 → 1.1.0

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: da8d90b4b7d128563272f45a94b547cbd74e8529c40895a024b492e1137aa03e
4
- data.tar.gz: 0ad90fffe64cd5cad8e9a06a344e31dfd7b8436e438712e6ec8ca3e120b028cc
3
+ metadata.gz: 7e18733eb9d27f1c0cb3f77f57ad6dba9c4d78902e975da88ba47f069d6408d5
4
+ data.tar.gz: e3c07a80dfaf0bebb18332d21b9b529e7247d6f5a2cb8e0bb62e57fba32fc541
5
5
  SHA512:
6
- metadata.gz: 679cabc6fd8e5562ad682b715345ef3a468c0a30c6c2513b984a813bf9d5edd8420d58154e173b05b0ea10589891b9f534470690a2c74fe5f5e4022ddf5eed56
7
- data.tar.gz: 48f700c2391ca1a281bf5fc7323786b5e75fd76686b95e1df67c59b3e21c191d980b9564de441bcf7c5e5bbe7489065e3dbc33530a4628576fea42c696903107
6
+ metadata.gz: d392b318c21364e89d3e815190814548cbe086c777f926a784091b9c90f27235d998af1cc0023cc7231b2c7469be31a9765adf66eaf4dab92b49d9d765f95c64
7
+ data.tar.gz: 3d38be42881dfdd5345ef5a64a4a355c035b904ef2a96bc5409ce7072300397637ab19cf50d1e1b9964942ffb15ccdfa5ebd9ee29931a6897bc9caf896f463e6
data/.rubocop.yml CHANGED
@@ -34,3 +34,7 @@ Metrics/PerceivedComplexity:
34
34
 
35
35
  Naming/VariableNumber:
36
36
  EnforcedStyle: snake_case
37
+
38
+ RSpec/FilePath:
39
+ Exclude:
40
+ - spec/lib/simpal/paypal_object_spec.rb
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Simpal
4
- VERSION = '1.0.2'
4
+ # @return [String] The gem's semantic version number.
5
+ #
6
+ VERSION = '1.1.0'
5
7
  end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Simpal
4
+ # Represents an API resource.
5
+ #
6
+ class PayPalObject
7
+ # @return [Regexp] A simple regular expression that matches the syntax of an ISO8601 date and time.
8
+ #
9
+ TIME_REGEXP = /\A[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|\+[0-9]{2}:[0-9]{2}(\.[0-9]+)?)\z/.freeze
10
+
11
+ # Create an object representing a resource from the PayPal API.
12
+ #
13
+ # @param resource [Hash] The resource retrieved from the PayPal API.
14
+ #
15
+ def initialize(resource = {})
16
+ transform = proc do |value|
17
+ case value
18
+ when Array then value.map { |v| transform.call(v) }
19
+ when Hash then PayPalObject.new(value)
20
+ when TIME_REGEXP then Time.parse(value)
21
+ else value
22
+ end
23
+ end
24
+
25
+ @resource = resource.each_with_object({}) do |(key, value), hash|
26
+ hash[key.to_s] = transform.call(value)
27
+ end
28
+
29
+ @resource.each_key do |key|
30
+ define_singleton_method(key.to_sym) do |*args, &block|
31
+ return @resource[key] if args.empty?
32
+ return super(*args, &block) if defined?(super)
33
+
34
+ raise NoMethodError, "method '#{key}' doesn't support arguments in #{self}"
35
+ end
36
+ end
37
+ end
38
+
39
+ # @return [Hash] A hash representation of the PayPal object.
40
+ #
41
+ def to_hash
42
+ transform = proc do |value|
43
+ case value
44
+ when Array then value.map { |v| transform.call(v) }
45
+ when PayPalObject then value.to_hash
46
+ when Time then value.iso8601
47
+ else value
48
+ end
49
+ end
50
+
51
+ @resource.transform_values(&transform)
52
+ end
53
+
54
+ # @return [String] A JSON representation of the PayPal object.
55
+ #
56
+ def inspect
57
+ resource_id = respond_to?(:id) && id ? " id=#{id}" : ''
58
+ json = JSON.pretty_generate(@resource)
59
+ "#<#{self.class}:0x#{object_id.to_s(16)}#{resource_id}> JSON: #{json}"
60
+ end
61
+
62
+ # Determines whether the object can respond to the specified method name.
63
+ #
64
+ # @param name [Symbol] The name of the method to determine responsiveness of.
65
+ # @param include_all [Boolean] `true` to search private and protected methods, `false` to search public only.
66
+ # @return [Boolean] `true` if the method can be responded to, `false` otherwise.
67
+ #
68
+ def respond_to_missing?(name, _include_all)
69
+ @resource.key?(name.to_s)
70
+ end
71
+
72
+ # Returns `nil` when the method is missing instead of raising a `NoMethodError` exception.
73
+ #
74
+ # @param name [Symbol] The name of the invoked method.
75
+ # @param args [Splat] The arguments passed into the invoked method.
76
+ # @return [NilClass]
77
+ #
78
+ def method_missing(_name, *_args)
79
+ nil
80
+ end
81
+
82
+ # @see Simpal::PayPalObject#to_hash
83
+ #
84
+ alias to_h to_hash
85
+ end
86
+ end
data/lib/simpal.rb CHANGED
@@ -10,7 +10,7 @@ require_relative 'simpal/middleware/authorization'
10
10
  require_relative 'simpal/middleware/headers'
11
11
  require_relative 'simpal/client_error'
12
12
  require_relative 'simpal/client'
13
- require_relative 'simpal/pay_pal_object'
13
+ require_relative 'simpal/paypal_object'
14
14
  require_relative 'simpal/api/orders'
15
15
  require_relative 'simpal/api/payments/authorizations'
16
16
  require_relative 'simpal/api/payments/captures'
data/simpal.gemspec CHANGED
@@ -9,12 +9,12 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ['support@nialtoservices.co.uk']
10
10
 
11
11
  spec.summary = "A simple, lightweight wrapper around PayPal's REST API."
12
- spec.homepage = 'https://github.com/nialtoservices/simpal'
12
+ spec.homepage = 'https://github.com/NialtoServices/simpal'
13
13
  spec.license = 'Apache-2.0'
14
14
  spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
- spec.metadata['source_code_uri'] = 'https://github.com/nialtoservices/simpal'
17
+ spec.metadata['source_code_uri'] = 'https://github.com/NialtoServices/simpal'
18
18
  spec.metadata['changelog_uri'] = 'https://github.com/NialtoServices/simpal/blob/main/CHANGELOG.md'
19
19
  spec.metadata['rubygems_mfa_required'] = 'true'
20
20
 
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.bindir = 'exe'
28
28
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
- spec.require_paths = ['lib']
29
+ spec.require_paths = %w[lib]
30
30
 
31
31
  spec.add_dependency 'faraday', '~> 2.0'
32
32
 
@@ -34,10 +34,10 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
35
35
  spec.add_development_dependency 'pry', '~> 0.14'
36
36
  spec.add_development_dependency 'rake', '~> 13.0'
37
- spec.add_development_dependency 'rspec', '~> 3.11'
38
- spec.add_development_dependency 'rubocop', '~> 1.32'
37
+ spec.add_development_dependency 'rspec', '~> 3.12'
38
+ spec.add_development_dependency 'rubocop', '~> 1.39'
39
39
  spec.add_development_dependency 'rubocop-rake', '~> 0.6'
40
- spec.add_development_dependency 'rubocop-rspec', '~> 2.12'
41
- spec.add_development_dependency 'sinatra', '~> 2.2'
42
- spec.add_development_dependency 'webmock', '~> 3.14'
40
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.15'
41
+ spec.add_development_dependency 'sinatra', '~> 3.0'
42
+ spec.add_development_dependency 'webmock', '~> 3.18'
43
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simpal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nialto Services
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-01 00:00:00.000000000 Z
11
+ date: 2022-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.11'
89
+ version: '3.12'
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: '3.11'
96
+ version: '3.12'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.32'
103
+ version: '1.39'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.32'
110
+ version: '1.39'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop-rake
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,42 +128,42 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '2.12'
131
+ version: '2.15'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '2.12'
138
+ version: '2.15'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: sinatra
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '2.2'
145
+ version: '3.0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '2.2'
152
+ version: '3.0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: webmock
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '3.14'
159
+ version: '3.18'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '3.14'
166
+ version: '3.18'
167
167
  description:
168
168
  email:
169
169
  - support@nialtoservices.co.uk
@@ -195,17 +195,17 @@ files:
195
195
  - lib/simpal/middleware/authorization.rb
196
196
  - lib/simpal/middleware/headers.rb
197
197
  - lib/simpal/order.rb
198
- - lib/simpal/pay_pal_object.rb
199
198
  - lib/simpal/payment/authorization.rb
200
199
  - lib/simpal/payment/capture.rb
201
200
  - lib/simpal/payment/refund.rb
201
+ - lib/simpal/paypal_object.rb
202
202
  - simpal.gemspec
203
- homepage: https://github.com/nialtoservices/simpal
203
+ homepage: https://github.com/NialtoServices/simpal
204
204
  licenses:
205
205
  - Apache-2.0
206
206
  metadata:
207
- homepage_uri: https://github.com/nialtoservices/simpal
208
- source_code_uri: https://github.com/nialtoservices/simpal
207
+ homepage_uri: https://github.com/NialtoServices/simpal
208
+ source_code_uri: https://github.com/NialtoServices/simpal
209
209
  changelog_uri: https://github.com/NialtoServices/simpal/blob/main/CHANGELOG.md
210
210
  rubygems_mfa_required: 'true'
211
211
  post_install_message:
@@ -223,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  - !ruby/object:Gem::Version
224
224
  version: '0'
225
225
  requirements: []
226
- rubygems_version: 3.3.7
226
+ rubygems_version: 3.3.20
227
227
  signing_key:
228
228
  specification_version: 4
229
229
  summary: A simple, lightweight wrapper around PayPal's REST API.
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Simpal
4
- # Represents an API resource.
5
- #
6
- class PayPalObject
7
- # Create a new object representing the provided resource.
8
- #
9
- # @param resource [Hash] The resource to represent.
10
- #
11
- def initialize(resource = {})
12
- transform = proc do |key, value|
13
- case value
14
- when Array then value.map { |v| transform.call(nil, v) }
15
- when Hash then PayPalObject.new(value)
16
- else
17
- if key && (key.end_with?('date') || key.end_with?('time'))
18
- Time.parse(value)
19
- else
20
- value
21
- end
22
- end
23
- end
24
-
25
- @values = resource.each_with_object({}) do |(key, value), values|
26
- values[key.to_s] = transform.call(key.to_s, value)
27
- add_reader(key)
28
- end
29
- end
30
-
31
- # @return [Hash] A hash representation of the PayPal object.
32
- #
33
- def to_hash
34
- transform = proc do |value|
35
- case value
36
- when Array then value.map { |v| transform.call(v) }
37
- when PayPalObject then value.to_hash
38
- else value.is_a?(Time) ? value.iso8601 : value
39
- end
40
- end
41
-
42
- @values.transform_values(&transform)
43
- end
44
-
45
- # @see Simpal::PayPalObject#to_hash
46
- #
47
- alias to_h to_hash
48
-
49
- # @return [String] A JSON string representation of the PayPal object.
50
- #
51
- def inspect
52
- paypal_id = respond_to?(:id) && id ? " id=#{id}" : ''
53
- json = JSON.pretty_generate(@values)
54
- "#<#{self.class}:0x#{object_id.to_s(16)}#{paypal_id}> JSON: #{json}"
55
- end
56
-
57
- # @return [Boolean] `true` to indicate that all methods can be responded to.
58
- #
59
- def respond_to_missing?(_name, _include_all)
60
- true
61
- end
62
-
63
- # @return [NilClass] `nil` instead of raising an exception.
64
- #
65
- def method_missing(_name, *args); end
66
-
67
- private
68
-
69
- # Add a read-only attribute for the specified value.
70
- #
71
- # @param name [String, Symbol] The name of the attribute to define.
72
- #
73
- def add_reader(name)
74
- metaclass.instance_eval do
75
- name = name.to_s
76
- if name.to_sym == :method
77
- define_method(name.to_sym) { |*args| args.empty? ? @values[name] : super(*args) }
78
- else
79
- define_method(name.to_sym) { @values[name] }
80
- end
81
- end
82
- end
83
-
84
- # @return [Class] The metaclass which can be used to define methods on this instance only.
85
- #
86
- def metaclass
87
- class << self
88
- self
89
- end
90
- end
91
- end
92
- end