tangany 0.0.1

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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.reek.yml +4 -0
  3. data/.rspec +3 -0
  4. data/.rubycritic.yml +7 -0
  5. data/.sasori/Dockerfile +51 -0
  6. data/.simplecov +13 -0
  7. data/CHANGELOG.md +5 -0
  8. data/CODE_OF_CONDUCT.md +84 -0
  9. data/Gemfile +20 -0
  10. data/Gemfile.lock +210 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +410 -0
  13. data/Rakefile +133 -0
  14. data/bin/console +22 -0
  15. data/bin/setup +8 -0
  16. data/bin/test-live +170 -0
  17. data/lib/config/chains.json +22 -0
  18. data/lib/tangany/application_contract.rb +19 -0
  19. data/lib/tangany/collection.rb +13 -0
  20. data/lib/tangany/config.rb +24 -0
  21. data/lib/tangany/custody/client.rb +37 -0
  22. data/lib/tangany/custody/collection.rb +17 -0
  23. data/lib/tangany/custody/contracts/wallets/create.rb +23 -0
  24. data/lib/tangany/custody/contracts/wallets/list.rb +37 -0
  25. data/lib/tangany/custody/contracts/wallets/update.rb +21 -0
  26. data/lib/tangany/custody/contracts/wallets.rb +3 -0
  27. data/lib/tangany/custody/contracts.rb +1 -0
  28. data/lib/tangany/custody/objects/wallet.rb +17 -0
  29. data/lib/tangany/custody/objects/wallet_recovery.rb +10 -0
  30. data/lib/tangany/custody/objects/wallet_status.rb +10 -0
  31. data/lib/tangany/custody/objects.rb +3 -0
  32. data/lib/tangany/custody/resource.rb +29 -0
  33. data/lib/tangany/custody/resources/wallet_statuses_resource.rb +9 -0
  34. data/lib/tangany/custody/resources/wallets_resource.rb +34 -0
  35. data/lib/tangany/custody/resources.rb +2 -0
  36. data/lib/tangany/custody.rb +7 -0
  37. data/lib/tangany/customers/application_contract.rb +6 -0
  38. data/lib/tangany/customers/client.rb +37 -0
  39. data/lib/tangany/customers/collection.rb +16 -0
  40. data/lib/tangany/customers/contracts/customers/create.rb +17 -0
  41. data/lib/tangany/customers/contracts/customers/create_schemas/contract.rb +21 -0
  42. data/lib/tangany/customers/contracts/customers/create_schemas/customer.rb +34 -0
  43. data/lib/tangany/customers/contracts/customers/list.rb +17 -0
  44. data/lib/tangany/customers/contracts/customers/update.rb +14 -0
  45. data/lib/tangany/customers/contracts/customers/update_schemas/customer.rb +15 -0
  46. data/lib/tangany/customers/contracts/customers.rb +3 -0
  47. data/lib/tangany/customers/contracts/natural_persons/create.rb +23 -0
  48. data/lib/tangany/customers/contracts/natural_persons/create_schemas/address.rb +23 -0
  49. data/lib/tangany/customers/contracts/natural_persons/create_schemas/document.rb +25 -0
  50. data/lib/tangany/customers/contracts/natural_persons/create_schemas/kyc.rb +24 -0
  51. data/lib/tangany/customers/contracts/natural_persons/create_schemas/natural_person.rb +44 -0
  52. data/lib/tangany/customers/contracts/natural_persons/create_schemas/pep.rb +22 -0
  53. data/lib/tangany/customers/contracts/natural_persons/create_schemas/sanctions.rb +22 -0
  54. data/lib/tangany/customers/contracts/natural_persons/list.rb +17 -0
  55. data/lib/tangany/customers/contracts/natural_persons/update.rb +14 -0
  56. data/lib/tangany/customers/contracts/natural_persons/update_schemas/natural_person.rb +15 -0
  57. data/lib/tangany/customers/contracts/natural_persons.rb +3 -0
  58. data/lib/tangany/customers/contracts/wallet_links/create.rb +28 -0
  59. data/lib/tangany/customers/contracts/wallet_links/list.rb +17 -0
  60. data/lib/tangany/customers/contracts/wallet_links.rb +2 -0
  61. data/lib/tangany/customers/contracts.rb +3 -0
  62. data/lib/tangany/customers/objects/address.rb +11 -0
  63. data/lib/tangany/customers/objects/contract.rb +13 -0
  64. data/lib/tangany/customers/objects/customer.rb +14 -0
  65. data/lib/tangany/customers/objects/document.rb +17 -0
  66. data/lib/tangany/customers/objects/kyc.rb +16 -0
  67. data/lib/tangany/customers/objects/natural_person.rb +30 -0
  68. data/lib/tangany/customers/objects/pep.rb +12 -0
  69. data/lib/tangany/customers/objects/sanctions.rb +12 -0
  70. data/lib/tangany/customers/objects/wallet_link.rb +14 -0
  71. data/lib/tangany/customers/objects.rb +5 -0
  72. data/lib/tangany/customers/resource.rb +11 -0
  73. data/lib/tangany/customers/resources/customers_resource.rb +27 -0
  74. data/lib/tangany/customers/resources/natural_persons_resource.rb +26 -0
  75. data/lib/tangany/customers/resources/wallet_links_resource.rb +37 -0
  76. data/lib/tangany/customers/resources.rb +3 -0
  77. data/lib/tangany/customers.rb +8 -0
  78. data/lib/tangany/error.rb +34 -0
  79. data/lib/tangany/json_patch.rb +65 -0
  80. data/lib/tangany/object.rb +43 -0
  81. data/lib/tangany/operation.rb +10 -0
  82. data/lib/tangany/resource.rb +80 -0
  83. data/lib/tangany/types.rb +7 -0
  84. data/lib/tangany/version.rb +3 -0
  85. data/lib/tangany.rb +47 -0
  86. data/sig/tangany.rbs +4 -0
  87. metadata +217 -0
@@ -0,0 +1,34 @@
1
+ module Tangany
2
+ class Error < StandardError; end
3
+
4
+ class InputError < Error
5
+ def initialize(validation_errors)
6
+ super(validation_errors.to_json)
7
+ end
8
+ end
9
+
10
+ class RequestError < Error
11
+ attr_reader :activity_id, :details, :error_code, :status_code, :validation_errors
12
+
13
+ def initialize(message, activity_id: nil, details: nil, error_code: nil, status_code: nil, validation_errors: [])
14
+ @activity_id = activity_id
15
+ @details = details
16
+ @error_code = error_code
17
+ @message = message
18
+ @status_code = status_code
19
+ @validation_errors = validation_errors
20
+
21
+ enrich_message
22
+
23
+ super(@message)
24
+ end
25
+
26
+ private
27
+
28
+ def enrich_message
29
+ @message = "[#{status_code}] #{@message}"
30
+ @message += " (#{details})" if details
31
+ @message += " Validation errors: " + validation_errors.map { |error| "#{error[:source]}: #{error[:message]}" }.join(", ") if validation_errors&.any?
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,65 @@
1
+ module Tangany
2
+ class JsonPatch
3
+ attr_reader :operations
4
+
5
+ def initialize(old_hash, new_hash, prefix = "")
6
+ raise ArgumentError, "Old hash must be a Hash" unless old_hash.is_a?(Hash)
7
+ raise ArgumentError, "New hash must be a Hash" unless new_hash.is_a?(Hash)
8
+ raise ArgumentError, "Prefix must be a String" unless prefix.is_a?(String)
9
+
10
+ @old_hash = old_hash
11
+ @new_hash = new_hash
12
+ @prefix = prefix
13
+
14
+ @keys = old_hash.keys | new_hash.keys
15
+ @operations = []
16
+ end
17
+
18
+ def generate
19
+ keys.each do |key, value|
20
+ old_value = old_hash[key]
21
+ new_value = new_hash[key]
22
+ generate_ops(key, old_value, new_value)
23
+ end
24
+ operations
25
+ end
26
+
27
+ def to_json
28
+ operations.to_json
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :keys, :new_hash, :old_hash, :prefix
34
+
35
+ def add_op(key, value)
36
+ operations << {op: "add", path: "#{prefix}/#{key}", value: value}
37
+ end
38
+
39
+ def generate_ops(key, old_value, new_value)
40
+ if old_value.is_a?(Hash) && new_value.is_a?(Hash)
41
+ @operations += JsonPatch.new(old_value, new_value, [prefix, key].join("/")).generate
42
+ elsif old_value != new_value
43
+ append_op(key, new_value)
44
+ end
45
+ end
46
+
47
+ def append_op(key, value)
48
+ if !old_hash.has_key?(key)
49
+ add_op(key, value)
50
+ elsif !new_hash.has_key?(key)
51
+ remove_op(key)
52
+ else
53
+ replace_op(key, value)
54
+ end
55
+ end
56
+
57
+ def remove_op(key)
58
+ operations << {op: "remove", path: "#{prefix}/#{key}"}
59
+ end
60
+
61
+ def replace_op(key, value)
62
+ operations << {op: "replace", path: "#{prefix}/#{key}", value: value}
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,43 @@
1
+ module Tangany
2
+ class Object < Dry::Struct
3
+ class << self
4
+ attr_reader :to_date_attributes, :to_datetime_attributes
5
+
6
+ def new(args)
7
+ translate_dates(args)
8
+ translate_datetimes(args)
9
+ super
10
+ end
11
+
12
+ def to_date(*attributes)
13
+ @to_date_attributes ||= []
14
+ @to_date_attributes += attributes
15
+ end
16
+
17
+ def to_datetime(*attributes)
18
+ @to_datetime_attributes ||= []
19
+ @to_datetime_attributes += attributes
20
+ end
21
+
22
+ private
23
+
24
+ def translate_dates(args)
25
+ (to_date_attributes || []).each do |attribute|
26
+ next if args[attribute].is_a?(Date)
27
+ args[attribute] = Date.parse(args[attribute]) if args[attribute]
28
+ end
29
+ end
30
+
31
+ def translate_datetimes(args)
32
+ (to_datetime_attributes || []).each do |attribute|
33
+ next if args[attribute].is_a?(DateTime)
34
+ args[attribute] = DateTime.parse(args[attribute]) if args[attribute]
35
+ end
36
+ end
37
+ end
38
+
39
+ def to_json
40
+ to_h.to_json
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ module Tangany
2
+ class Operation < Dry::Struct
3
+ JSON_POINTER_REGEX = %r{(/[^/]+)+}
4
+
5
+ attribute :op, Types::String.enum("add", "remove", "replace")
6
+ attribute :path, Types::String.constrained(format: JSON_POINTER_REGEX)
7
+ attribute? :from, Types::String.constrained(format: JSON_POINTER_REGEX)
8
+ attribute? :value, Types::Bool | Types::Decimal | Types::Float | Types::Hash | Types::Integer | Types::String
9
+ end
10
+ end
@@ -0,0 +1,80 @@
1
+ module Tangany
2
+ class Resource
3
+ def initialize(client)
4
+ @client = client
5
+ end
6
+
7
+ def delete_request(url, headers: {})
8
+ handle_response(client.connection.delete do |request|
9
+ request.url(url)
10
+ request.headers = default_headers.merge(headers)
11
+ end)
12
+ end
13
+
14
+ def get_request(url, params: {}, headers: {})
15
+ handle_response(client.connection.get do |request|
16
+ request.url(url)
17
+ request.params = params
18
+ request.headers = default_headers.merge(headers)
19
+ end)
20
+ end
21
+
22
+ def patch_request(url, body:, headers: {})
23
+ handle_response(client.connection.patch do |request|
24
+ request.url(url)
25
+ request.body = body
26
+ request.headers = default_headers.merge({"Content-Type" => "application/json-patch+json"}.merge(headers))
27
+ end)
28
+ end
29
+
30
+ def post_request(url, body:, headers: {})
31
+ handle_response(client.connection.post do |request|
32
+ request.url(url)
33
+ request.body = body
34
+ request.headers = default_headers.merge(headers)
35
+ end)
36
+ end
37
+
38
+ def put_request(url, body:, headers: {})
39
+ handle_response(client.connection.put do |request|
40
+ request.url(url)
41
+ request.body = body
42
+ request.headers = default_headers.merge({"Content-Type" => "application/json-patch+json"}.merge(headers))
43
+ end)
44
+ end
45
+
46
+ private
47
+
48
+ attr_reader :client
49
+
50
+ def build_update_body_json(resource_hash, safe_params)
51
+ merged_hash = resource_hash.deep_merge(safe_params)
52
+ JsonPatch.new(resource_hash, merged_hash).generate.to_json
53
+ end
54
+
55
+ def handle_response(response)
56
+ if response.status >= 400
57
+ raise RequestError.new(
58
+ response.body[:message],
59
+ activity_id: response.headers["tangany-activity-id"],
60
+ details: response.body[:details],
61
+ error_code: response.body[:errorCode],
62
+ status_code: response.body[:statusCode],
63
+ validation_errors: response.body[:validationErrors]
64
+ )
65
+ end
66
+
67
+ response
68
+ end
69
+
70
+ def sanitize_params!(params)
71
+ root_name = self.class.name.split("::")[0...-1].join("::")
72
+ resource_name = self.class.name.split("::").last.gsub("Resource", "")
73
+ action_name = caller_locations(1..1).first.label.camelcase
74
+
75
+ contract = "#{root_name}::Contracts::#{resource_name}::#{action_name.camelcase}".constantize
76
+
77
+ contract.new.to_safe_params!(params)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,7 @@
1
+ require "dry-struct"
2
+
3
+ module Tangany
4
+ module Types
5
+ include Dry.Types()
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Tangany
2
+ VERSION = "0.0.1"
3
+ end
data/lib/tangany.rb ADDED
@@ -0,0 +1,47 @@
1
+ require "forwardable"
2
+
3
+ require_relative "tangany/config"
4
+
5
+ module Tangany
6
+ @config = Config.new
7
+
8
+ class << self
9
+ extend Forwardable
10
+
11
+ attr_reader :config
12
+
13
+ def_delegators :config,
14
+ :chain,
15
+ :chain=,
16
+ :chains,
17
+ :client_id,
18
+ :client_id=,
19
+ :client_secret,
20
+ :client_secret=,
21
+ :custody_base_url,
22
+ :customers_base_url,
23
+ :customers_version,
24
+ :environment,
25
+ :environment=,
26
+ :subscription,
27
+ :subscription=,
28
+ :vault_url,
29
+ :vault_url=
30
+ end
31
+ end
32
+
33
+ require_relative "tangany/error"
34
+ require_relative "tangany/json_patch"
35
+
36
+ require_relative "tangany/collection"
37
+ require_relative "tangany/resource"
38
+ require_relative "tangany/types"
39
+ require_relative "tangany/version"
40
+
41
+ require_relative "tangany/application_contract"
42
+
43
+ require_relative "tangany/object"
44
+ require_relative "tangany/operation"
45
+
46
+ require_relative "tangany/custody"
47
+ require_relative "tangany/customers"
data/sig/tangany.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Tangany
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,217 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tangany
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bitbond
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 8.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '6.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 8.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: dry-struct
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.6'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 2.0.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '1.6'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 2.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: dry-validation
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '1.10'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: 2.0.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1.10'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: 2.0.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: faraday
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '2.7'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.8.0
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '2.7'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 2.8.0
93
+ description: Tangany is a German provider for custody of digital assets and crypto.See
94
+ https://tangany.com/ for details.
95
+ email: support@bitbond.com
96
+ executables:
97
+ - console
98
+ - setup
99
+ - test-live
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - ".reek.yml"
104
+ - ".rspec"
105
+ - ".rubycritic.yml"
106
+ - ".sasori/Dockerfile"
107
+ - ".simplecov"
108
+ - CHANGELOG.md
109
+ - CODE_OF_CONDUCT.md
110
+ - Gemfile
111
+ - Gemfile.lock
112
+ - LICENSE.txt
113
+ - README.md
114
+ - Rakefile
115
+ - bin/console
116
+ - bin/setup
117
+ - bin/test-live
118
+ - lib/config/chains.json
119
+ - lib/tangany.rb
120
+ - lib/tangany/application_contract.rb
121
+ - lib/tangany/collection.rb
122
+ - lib/tangany/config.rb
123
+ - lib/tangany/custody.rb
124
+ - lib/tangany/custody/client.rb
125
+ - lib/tangany/custody/collection.rb
126
+ - lib/tangany/custody/contracts.rb
127
+ - lib/tangany/custody/contracts/wallets.rb
128
+ - lib/tangany/custody/contracts/wallets/create.rb
129
+ - lib/tangany/custody/contracts/wallets/list.rb
130
+ - lib/tangany/custody/contracts/wallets/update.rb
131
+ - lib/tangany/custody/objects.rb
132
+ - lib/tangany/custody/objects/wallet.rb
133
+ - lib/tangany/custody/objects/wallet_recovery.rb
134
+ - lib/tangany/custody/objects/wallet_status.rb
135
+ - lib/tangany/custody/resource.rb
136
+ - lib/tangany/custody/resources.rb
137
+ - lib/tangany/custody/resources/wallet_statuses_resource.rb
138
+ - lib/tangany/custody/resources/wallets_resource.rb
139
+ - lib/tangany/customers.rb
140
+ - lib/tangany/customers/application_contract.rb
141
+ - lib/tangany/customers/client.rb
142
+ - lib/tangany/customers/collection.rb
143
+ - lib/tangany/customers/contracts.rb
144
+ - lib/tangany/customers/contracts/customers.rb
145
+ - lib/tangany/customers/contracts/customers/create.rb
146
+ - lib/tangany/customers/contracts/customers/create_schemas/contract.rb
147
+ - lib/tangany/customers/contracts/customers/create_schemas/customer.rb
148
+ - lib/tangany/customers/contracts/customers/list.rb
149
+ - lib/tangany/customers/contracts/customers/update.rb
150
+ - lib/tangany/customers/contracts/customers/update_schemas/customer.rb
151
+ - lib/tangany/customers/contracts/natural_persons.rb
152
+ - lib/tangany/customers/contracts/natural_persons/create.rb
153
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/address.rb
154
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/document.rb
155
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/kyc.rb
156
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/natural_person.rb
157
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/pep.rb
158
+ - lib/tangany/customers/contracts/natural_persons/create_schemas/sanctions.rb
159
+ - lib/tangany/customers/contracts/natural_persons/list.rb
160
+ - lib/tangany/customers/contracts/natural_persons/update.rb
161
+ - lib/tangany/customers/contracts/natural_persons/update_schemas/natural_person.rb
162
+ - lib/tangany/customers/contracts/wallet_links.rb
163
+ - lib/tangany/customers/contracts/wallet_links/create.rb
164
+ - lib/tangany/customers/contracts/wallet_links/list.rb
165
+ - lib/tangany/customers/objects.rb
166
+ - lib/tangany/customers/objects/address.rb
167
+ - lib/tangany/customers/objects/contract.rb
168
+ - lib/tangany/customers/objects/customer.rb
169
+ - lib/tangany/customers/objects/document.rb
170
+ - lib/tangany/customers/objects/kyc.rb
171
+ - lib/tangany/customers/objects/natural_person.rb
172
+ - lib/tangany/customers/objects/pep.rb
173
+ - lib/tangany/customers/objects/sanctions.rb
174
+ - lib/tangany/customers/objects/wallet_link.rb
175
+ - lib/tangany/customers/resource.rb
176
+ - lib/tangany/customers/resources.rb
177
+ - lib/tangany/customers/resources/customers_resource.rb
178
+ - lib/tangany/customers/resources/natural_persons_resource.rb
179
+ - lib/tangany/customers/resources/wallet_links_resource.rb
180
+ - lib/tangany/error.rb
181
+ - lib/tangany/json_patch.rb
182
+ - lib/tangany/object.rb
183
+ - lib/tangany/operation.rb
184
+ - lib/tangany/resource.rb
185
+ - lib/tangany/types.rb
186
+ - lib/tangany/version.rb
187
+ - sig/tangany.rbs
188
+ homepage: https://docs.tangany.com/
189
+ licenses:
190
+ - MIT
191
+ metadata:
192
+ bug_tracker_uri: https://github.com/bitbond/tangany-ruby/issues
193
+ changelog_uri: https://github.com/bitbond/tangany-ruby/blob/master/CHANGELOG.md
194
+ documentation_uri: https://docs.tangany.com/
195
+ github_repo: ssh://github.com/bitbond/tangany-ruby
196
+ homepage_uri: https://docs.tangany.com/
197
+ source_code_uri: https://github.com/bitbond/tangany-ruby
198
+ post_install_message:
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: 2.7.5
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubygems_version: 3.3.22
214
+ signing_key:
215
+ specification_version: 4
216
+ summary: Ruby bindings for the Tangany APIs
217
+ test_files: []