netether 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 61a74f049468a77ca2b0110b2b485115d89d7442
4
+ data.tar.gz: 9dde9eee6feb3750c4293b21f40897f21903fa4d
5
+ SHA512:
6
+ metadata.gz: 7cedbb52d485bd4ed485973a7efda7d39b7628d20a6c8c7a452d9258cb621a46a40aec60f59ed11e8c38bc4b13019428d6fb65eb10e14715e7651ed3b8ca2da1
7
+ data.tar.gz: 65632bac9bef1923ce8510b21a11f2773637524330c3348d0d3346e82fdaba6182af6329d698f94649decf52141f1b4bb517ec5979173a8a14a5d16aebca8beb
data/.gitignore ADDED
Binary file
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.3
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in netether.gemspec
4
+ gem 'rake'
5
+ gem 'byebug'
6
+ gem 'test-unit'
7
+ gem 'test-unit-mock'
8
+ gem 'httpclient'
9
+ gem 'mocha'
10
+ gem 'webmock'
data/LICENSE.txt ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2015, Netki, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification, are permitted
5
+ provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions
8
+ and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11
+ and the following disclaimer in the documentation and/or other materials provided with the distribution.
12
+
13
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse
14
+ or promote products derived from this software without specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
17
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
19
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
20
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
22
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23
+ POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ ![Rubygem](https://img.shields.io/gem/dv/netki/stable.svg)
2
+
3
+ # Ruby Netki Partner API Client
4
+
5
+ This Ruby gem provides a client for [Netki's](https://netki.com) Partner API.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'netki'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install netki
22
+
23
+ ## Usage
24
+
25
+ See rdoc-generated documentation for this Gem in doc/
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake false` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/netkicorp/ruby-partner-client.
36
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/test*.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ desc "Run tests"
11
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require_relative "../lib/netether"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/netether.rb ADDED
@@ -0,0 +1,6 @@
1
+ require_relative 'netether/version'
2
+ require_relative 'netether/netether'
3
+
4
+ module Netether
5
+
6
+ end
@@ -0,0 +1,331 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'httpclient'
4
+ require 'json'
5
+ require_relative 'utilities'
6
+
7
+ module Netether
8
+
9
+ # Request Utility Functionality
10
+ def self.process_request(api_key, partner_id, uri, method, bodyData=nil)
11
+
12
+ raise "Invalid HTTP Method" unless ['GET','POST','PUT','DELETE'].include? method
13
+
14
+ # Setup Headers
15
+ headers = {}
16
+ headers["Content-Type"] = "application/json"
17
+ headers["Authorization"] = api_key if api_key
18
+ headers["X-Partner-ID"] = partner_id if partner_id
19
+
20
+ # Setup Request Options
21
+ opts = {}
22
+ opts[:header] = headers
23
+ opts[:body] = bodyData if bodyData
24
+
25
+ client = HTTPClient.new
26
+ _uri = URI.parse(uri)
27
+ response = client.request(method, _uri, opts)
28
+
29
+ # Short Circuit Return if 204 Response on DELETE
30
+ return {} if response.code == 204 && method == "DELETE"
31
+
32
+ # We should have response content at this point
33
+ raise "Empty Response Received" if response.content.nil? || response.content.empty?
34
+
35
+ # Verify we have the correct content type
36
+ raise "Non-JSON Content Type" if response.headers['Content-Type'] != 'application/json'
37
+
38
+ # Make Sure We Can Decode JSON Response
39
+ begin
40
+ ret_data = JSON.parse(response.content)
41
+ rescue JSON::ParserError => e
42
+ raise "Invalid JSON Response Received"
43
+ end
44
+
45
+ # Process Error
46
+ if response.code >= 300 || !ret_data['success']
47
+ return ret_data['message']
48
+ end
49
+
50
+ return ret_data
51
+ end
52
+
53
+ # Obtain a WalletName object by querying the Netki Open API.
54
+ def self.wallet_lookup(uri, currency, api_url='https://api.netki.com')
55
+ wallet_name = URI.parse(uri).host || uri.to_s
56
+
57
+ response = process_request(nil, nil, "#{api_url}/api/wallet_lookup/#{wallet_name}/#{currency.downcase}", 'GET')
58
+
59
+ netki_address = response['wallet_address']
60
+
61
+ if !netki_address.nil? && netki_address != 0
62
+ return netki_address
63
+ else
64
+ return false, "No Address Found"
65
+ end
66
+ end
67
+
68
+ ##
69
+ # The WalletName object represents a Netki Wallet Name object.
70
+ #
71
+ class WalletName
72
+
73
+ ##
74
+ # :args: domain_name, name, wallets, external_id, id,
75
+ def initialize(domain_name, name, wallets={}, external_id: nil, id: nil)
76
+ @domain_name = domain_name
77
+ @name = name
78
+
79
+ @wallets = wallets.inject({}) do |hsh, (currency, value)|
80
+ hsh[currency] = value.is_a?(Hash) ? value : { address: value }
81
+ hsh
82
+ end
83
+ @external_id = external_id
84
+ @id = id
85
+ end
86
+
87
+ attr_accessor :domain_name, :name, :id, :external_id
88
+
89
+ # :section: Getters
90
+
91
+ # Get Address for Existing Currency
92
+ def get_address(currency)
93
+ @wallets[currency][:address]
94
+ end
95
+
96
+ # Get Wallet Name Array of Used Currencies
97
+ def used_currencies
98
+ @wallets.keys
99
+ end
100
+
101
+ # :section: Currency Address Operations
102
+
103
+ # Set the address or URI for the given currency for this wallet name
104
+ def set_currency_address(currency, address)
105
+ @wallets[currency] = { address: address }
106
+ end
107
+
108
+ # Remove a used currency from this wallet name
109
+ def remove_currency(currency)
110
+ @wallets.delete(currency) if @wallets.has_key? currency
111
+ end
112
+
113
+ # :section: Setters
114
+
115
+ def set_api_opts(api_url, partner_id, api_key) # :nodoc:
116
+ @api_url = api_url
117
+ @partner_id = partner_id
118
+ @api_key = api_key
119
+ end
120
+
121
+ # :section: Actions
122
+
123
+ # Save the currency WalletName object to the remote service
124
+ def save
125
+ wallet_data = []
126
+ @wallets.each do |currency, wallet|
127
+ # NOTE: Unsure if remote service supports storing metadata (params/bip70 req)?
128
+ wallet_data.push(
129
+ {
130
+ currency: currency,
131
+ wallet_address: wallet[:_raw] ? wallet[:_raw] : wallet[:address]
132
+ }
133
+ )
134
+ end
135
+
136
+ wn_data = {
137
+ domain_name: @domain_name,
138
+ name: @name,
139
+ wallets: wallet_data,
140
+ external_id: @external_id || 'null'
141
+ }
142
+
143
+ wn_api_data = {}
144
+ wn_api_data['wallet_names'] = [wn_data]
145
+
146
+ if @id
147
+ wn_data['id'] = @id
148
+ response = Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/walletname", 'PUT', JSON.dump(wn_api_data))
149
+ else
150
+ response = Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/walletname", 'POST', JSON.dump(wn_api_data))
151
+ end
152
+
153
+ unless @id
154
+ response['wallet_names'].each do |wn|
155
+ if (response['success'] &&
156
+ wn['domain_name'] == @domain_name &&
157
+ wn['name'] == @name)
158
+ @id = wn['id']
159
+ else
160
+ raise 'Success, but invalid response received!'
161
+ end
162
+ end
163
+ end
164
+
165
+ end
166
+
167
+ # Delete this WalletName object from the remote service
168
+ def delete
169
+ raise 'Unable to Delete Object that Does Not Exist Remotely' unless @id
170
+
171
+ wn_api_data = {
172
+ wallet_names: [ { domain_name: @domain_name, id: @id } ]
173
+ }
174
+
175
+ Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/walletname", 'DELETE', JSON.dump(wn_api_data))
176
+ end
177
+ end
178
+
179
+ class NetkiPartner
180
+
181
+ ##
182
+ # The Netki object must be initialized with the Partner ID and API Key to be useful
183
+ #
184
+ # * Partner ID -> Netki Partner ID is available on your partner API Key Page
185
+ # * API Key -> Netki API Key is available only upon API Key creation. Be sure to store it somewhere safe!
186
+ #
187
+
188
+ attr_accessor :partner_id, :api_key, :api_url
189
+
190
+ def initialize(partner_id=nil, api_key=nil, api_url='https://api.netki.com')
191
+ @partner_id = partner_id
192
+ @api_key = api_key
193
+ @api_url = api_url
194
+ end
195
+
196
+ ##
197
+ # Create a new Partner
198
+ # * partner_name -> Name of new sub-partner to create
199
+ #
200
+ def create_new_partner(partner_name)
201
+ encoded_partner_name = URI.encode(partner_name)
202
+ response = Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/admin/partner/#{encoded_partner_name}", method='POST')
203
+ response['partner']['id']
204
+ end
205
+
206
+ ##
207
+ # List current and sub partners
208
+ # Returns a list of partner Hashes, each containing an id and name key
209
+ #
210
+ def get_partners()
211
+ response = Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/admin/partner", method='GET')
212
+ response['partners']
213
+ end
214
+
215
+ ##
216
+ # Delete a Partner
217
+ # * partner_name -> Name of sub-partner to delete
218
+ # NOTE: You cannot delete your own partner resource
219
+ #
220
+ def delete_partner(partner_name)
221
+ encoded_partner_name = URI.encode(partner_name)
222
+ Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/admin/partner/#{encoded_partner_name}", method='DELETE')
223
+ true
224
+ end
225
+
226
+ ##
227
+ # Create a new domain
228
+ # * domain_name -> Name of new domain to create
229
+ # * partner_id -> (optional) Partner that should own the new domain
230
+ #
231
+ def create_new_domain(domain_name, partner_id=nil)
232
+ api_data = {}
233
+ api_data['partner_id'] = partner_id unless partner_id.nil?
234
+ Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/domain/#{domain_name}", method='POST', JSON.dump(api_data))
235
+ true
236
+ end
237
+
238
+ ##
239
+ # List available domain resources
240
+ # Returns a list of domain Hashes, each containing a domain_name and tld_type key
241
+ #
242
+ def get_domains()
243
+ response = Netether.process_request(@api_key, @partner_id, "#{@api_url}/api/domain", method='GET')
244
+ response['domains']
245
+ end
246
+
247
+ ##
248
+ # List status of domain resources
249
+ # * domain_name -> (Optional) Name of domain to return status for
250
+ #
251
+ # If domain_name is omitted status is returned for all available domain resources.
252
+ #
253
+ # Returns a list of Hashes, each containing current status for each domain
254
+ #
255
+ def get_domain_status(domain_name=nil)
256
+ uri="#{@api_url}/v1/partner/domain"
257
+ uri << "/#{domain_name}" unless domain_name.nil?
258
+
259
+ response = Netether.process_request(@api_key, @partner_id, uri, method='GET')
260
+ response['domains'] || response
261
+ end
262
+
263
+ ##
264
+ # Get DNSSEC Status of Domain
265
+ # * domain_name -> (Required) Name of domain to get DNSSEC status for
266
+ #
267
+ # Returns a hash containing the follow DNSSEC-related keys:
268
+ # - ds_records (list)
269
+ # - public_key_signing_key
270
+ # - nextroll_date
271
+ # - nameservers (list)
272
+
273
+ def get_domain_dnssec(domain_name)
274
+ Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/domain/dnssec/#{domain_name}", method='GET')
275
+ end
276
+
277
+ ##
278
+ # Delete a Domain
279
+ # * domain_name -> Name of delete to delete
280
+ #
281
+ def delete_domain(domain_name)
282
+ Netether.process_request(@api_key, @partner_id, "#{@api_url}/v1/partner/domain/#{domain_name}", method='DELETE')
283
+ true
284
+ end
285
+
286
+
287
+ ##
288
+ # Create a new Wallet Name object using this factory method.
289
+ # * domain_name -> The pre-configured domain name you would like to add this new wallet name to
290
+ # * name -> The DNS name that you would like this new wallet name to have (ie.. name.domain_name)
291
+ # * wallets -> This is a hash where the key is the currency (ie.. btc, ltc, dgc, tusd) and the value is:
292
+ # the wallet address OR
293
+ # URL of the BIP32 / BIP70 address server OR
294
+ # a hash containing an :address and other metadata
295
+ # * external_id -> Any unique external ID that you may want to use to track this specific wallet name
296
+ #
297
+ def create_new_walletname(domain_name, name, wallets={}, external_id=nil)
298
+ new_wn = WalletName.new(domain_name, name, wallets, external_id: external_id)
299
+ new_wn.set_api_opts(@api_url, @partner_id, @api_key)
300
+ new_wn
301
+ end
302
+
303
+ ##
304
+ # Returns an array of WalletName objects based on the given search parameters:
305
+ # * domain_name -> The pre-configured domain that you have already been using for wallet names
306
+ # * external_id -> The external ID previously given to the single wallet name you want to retrieve
307
+ def get_wallet_names(domain_name=nil, external_id=nil)
308
+ args = []
309
+ args.push("domain_name=#{domain_name}") if domain_name
310
+ args.push("external_id=#{external_id}") if external_id
311
+
312
+ uri = "#{@api_url}/v1/partner/walletname"
313
+ uri = (uri + "?" + args.join("&")) unless args.empty?
314
+ response = Netether.process_request(@api_key, @partner_id, uri, method='GET')
315
+
316
+ return [] if !response.has_key? 'wallet_name_count' || response['wallet_name_count'] == 0
317
+
318
+ wn_list = []
319
+ response['wallet_names'].each do |wn|
320
+ wallets = {}
321
+ wn['wallets'].each do |wallet|
322
+ wallets[wallet['currency']] = wallet['wallet_address']
323
+ end
324
+ wn_obj = WalletName.new(wn['domain_name'], wn['name'], wallets, external_id: wn['external_id'], id: wn['id'])
325
+ wn_obj.set_api_opts(@api_url, @partner_id, @api_key)
326
+ wn_list.push(wn_obj)
327
+ end
328
+ wn_list
329
+ end
330
+ end
331
+ end
@@ -0,0 +1,51 @@
1
+ module Netether
2
+
3
+ KNOWN_PREFIXES = [ 'bitcoin', 'litecoin', 'dogecoin' ]
4
+
5
+ class InvalidURIError < StandardError; end
6
+
7
+ def self.parse_bitcoin_uri(uri, tolerate_errors: false)
8
+ parts = uri.split(':', 2)
9
+
10
+ unless KNOWN_PREFIXES.include?(parts.shift)
11
+ raise InvalidURIError.new("unknown URI prefix")
12
+ end
13
+
14
+ # parts => [base58][?[bitcoinparam, [&bitcoinparam, ...]]
15
+ base58address, query = parts.first.split('?', 2)
16
+ response = { address: base58address }
17
+
18
+ begin
19
+ response.merge!(_parse_bip_72(query))
20
+ rescue InvalidURIError => e
21
+ raise e unless tolerate_errors
22
+ end
23
+
24
+ response
25
+ end
26
+
27
+ # https://github.com/bitcoin/bips/blob/master/bip-0072.mediawiki
28
+ def self._parse_bip_72(querystring)
29
+ params = _parse_bip_21(querystring)
30
+ { r: params['r'], params: params }
31
+ end
32
+
33
+ # https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
34
+ def self._parse_bip_21(querystring)
35
+
36
+ param_pairs = querystring.split('&') # '&' reserved as separator in bip21
37
+
38
+ param_pairs.inject({}) do |hsh, pair|
39
+ parts = pair.split('=') # '=' reserved as separator in bip21
40
+
41
+ raise InvalidURIError.new("unbalanced parameter #{pair}") unless (
42
+ parts.size == 2 &&
43
+ parts[0].size > 0 &&
44
+ parts[1].size > 0)
45
+ raise InvalidURIError.new("duplicate parameter #{parts[0]}") unless hsh[parts[0]].nil?
46
+
47
+ hsh[parts[0]] = parts[1]
48
+ hsh
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module Netether
2
+ VERSION = "0.0.6"
3
+ end
data/netether.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'netether/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "netether"
8
+ spec.version = Netether::VERSION
9
+ spec.licenses = ['BSD-3-Clause']
10
+ spec.authors = ["Whit Jackson", "Matt David"]
11
+ spec.email = ["whit@tether.to", "opensource@netki.com"]
12
+
13
+ spec.summary = %q{Tether's fork of Netki Partner API}
14
+ spec.description = %q{Netki module that provides access to the Netki Wallet Name Partner API}
15
+ spec.homepage = "https://github.com/whitj00/netether"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency "httpclient", "~> 2.6"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.10"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "test-unit", "~> 3.1"
27
+ spec.add_development_dependency "test-unit-mock", "~> 0.3"
28
+ spec.add_development_dependency "mocha", "~> 1.1"
29
+ spec.add_development_dependency "webmock", "~> 1.21"
30
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: netether
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - Whit Jackson
8
+ - Matt David
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2015-10-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httpclient
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.6'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.6'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.10'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.10'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '10.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '10.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: test-unit
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.1'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.1'
70
+ - !ruby/object:Gem::Dependency
71
+ name: test-unit-mock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.3'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '0.3'
84
+ - !ruby/object:Gem::Dependency
85
+ name: mocha
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1.1'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.1'
98
+ - !ruby/object:Gem::Dependency
99
+ name: webmock
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.21'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.21'
112
+ description: Netki module that provides access to the Netki Wallet Name Partner API
113
+ email:
114
+ - whit@tether.to
115
+ - opensource@netki.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - bin/console
127
+ - bin/setup
128
+ - lib/netether.rb
129
+ - lib/netether/netether.rb
130
+ - lib/netether/utilities.rb
131
+ - lib/netether/version.rb
132
+ - netether.gemspec
133
+ homepage: https://github.com/whitj00/netether
134
+ licenses:
135
+ - BSD-3-Clause
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.4.8
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: Tether's fork of Netki Partner API
157
+ test_files: []
158
+ has_rdoc: