tangany 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []