netether 0.0.6

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 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: