namecheap 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.
- data/.gitignore +4 -0
- data/.rvmrc +3 -0
- data/Gemfile +4 -0
- data/README.textile +20 -0
- data/Rakefile +1 -0
- data/lib/namecheap.rb +77 -0
- data/lib/namecheap.yml +4 -0
- data/lib/namecheap/version.rb +3 -0
- data/namecheap.gemspec +25 -0
- data/spec/namecheap_domain_check_response_spec.rb +78 -0
- data/spec/namecheap_response_spec.rb +25 -0
- data/spec/namecheap_spec.rb +85 -0
- data/spec/spec_helper.rb +12 -0
- metadata +108 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/README.textile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
h1. Ruby Wrapper for Namecheap.com API
|
2
|
+
|
3
|
+
Allow the ability to check domain availability through namecheap.com API.
|
4
|
+
|
5
|
+
h2. Usage
|
6
|
+
|
7
|
+
<pre>
|
8
|
+
<code>
|
9
|
+
require 'lib/namecheap'
|
10
|
+
|
11
|
+
namecheap = Namecheap.new
|
12
|
+
namecheap.is_domain_availble? 'hashrocket.com' # => false
|
13
|
+
</code>
|
14
|
+
</pre>
|
15
|
+
|
16
|
+
h2. Contributors
|
17
|
+
|
18
|
+
* "Hashrocket":http://www.hashrocket.com
|
19
|
+
* "Corey Grusden":http://coreygrusden.com
|
20
|
+
* "Big Tiger":http://bigtiger.github.com
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/namecheap.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require "namecheap/version"
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
module Namecheap
|
5
|
+
end
|
6
|
+
|
7
|
+
class NilNamecheapResponse < Exception
|
8
|
+
end
|
9
|
+
|
10
|
+
class NamecheapResponse
|
11
|
+
def initialize(response)
|
12
|
+
@response = response
|
13
|
+
end
|
14
|
+
|
15
|
+
def status
|
16
|
+
@response["ApiResponse"]["Status"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def message
|
20
|
+
if @response["ApiResponse"]["Errors"].any?
|
21
|
+
@response["ApiResponse"]["Errors"]["Error"]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def items
|
26
|
+
response = @response["ApiResponse"]["CommandResponse"]
|
27
|
+
raise NilNamecheapResponse if response.nil?
|
28
|
+
response.delete_if { |key, value| key == "Type" }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class DomainCheck
|
34
|
+
attr_accessor :domain, :available, :error, :description
|
35
|
+
|
36
|
+
def initialize(item)
|
37
|
+
@domain = item["Domain"]
|
38
|
+
@available = (item["Available"] == "true" ? true : false)
|
39
|
+
@error = item["ErrorNo"]
|
40
|
+
@description = item["Description"]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class NamecheapDomainCheckResponse < NamecheapResponse
|
45
|
+
def items
|
46
|
+
super.collect {|item| DomainCheck.new(item[1])}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Namecheap
|
51
|
+
attr_reader :username, :key, :client_ip
|
52
|
+
def initialize(options = {})
|
53
|
+
config = YAML.load_file("#{File.dirname(__FILE__)}/namecheap.yml").symbolize_keys!
|
54
|
+
@key = options[:key] || config[:key]
|
55
|
+
@username = options[:username] || config[:username]
|
56
|
+
@client_ip = options[:client_ip] || config[:client_ip]
|
57
|
+
end
|
58
|
+
|
59
|
+
def is_domain_available?(domain)
|
60
|
+
results = domain_check(domain).items
|
61
|
+
results.nil? ? false : results.first.available?
|
62
|
+
end
|
63
|
+
|
64
|
+
def domain_check(domain)
|
65
|
+
domain = domain.join(",") if domain.is_a? Array
|
66
|
+
NamecheapDomainCheckResponse.new(do_query("namecheap.domains.check", "&DomainList=#{domain}"))
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
|
71
|
+
def do_query(api_method, options)
|
72
|
+
query = "https://api.sandbox.namecheap.com/xml.response?ApiUser=#{@username}&ApiKey=#{@key}&UserName=#{@username}&ClientIp=#{@client_ip}&Command=#{api_method}"
|
73
|
+
query += options
|
74
|
+
HTTParty.get(query)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
data/lib/namecheap.yml
ADDED
data/namecheap.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "namecheap/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "namecheap"
|
7
|
+
s.version = Namecheap::VERSION
|
8
|
+
s.authors = ["parasquid"]
|
9
|
+
s.email = ["tristan.gomezd@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/parasquid/namecheap"
|
11
|
+
s.summary = %q{Ruby wrapper for the Namecheap API}
|
12
|
+
s.description = %q{Ruby wrapper for the Namecheap API}
|
13
|
+
|
14
|
+
s.rubyforge_project = "namecheap"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
s.add_runtime_dependency "httparty"
|
25
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/namecheap'
|
3
|
+
|
4
|
+
describe NamecheapDomainCheckResponse do
|
5
|
+
|
6
|
+
describe "successful response from namecheap" do
|
7
|
+
before(:each) do
|
8
|
+
@domain_check_response_hash = {"ApiResponse"=>{"Status"=>"OK",
|
9
|
+
"Errors"=>{},
|
10
|
+
"CommandResponse" => {"Type" => "namecheap.domains.check",
|
11
|
+
"DomainCheckResult1" => {"Domain" => "domain1.com", "Available" => "true"},
|
12
|
+
"DomainCheckResult2" => {"Domain" => "domain2.com", "Available" => "false"},
|
13
|
+
"DomainCheckResult3" => {"Domain" => "domain.wtf", "Available" => "error",
|
14
|
+
"ErrorNo" => "750", "Description" => "No response from the registry"}},
|
15
|
+
"GMTTimeDifference"=>"--6:00",
|
16
|
+
"RequestedCommand"=>"namecheap.domains.check",
|
17
|
+
"Server"=>"SERVER159",
|
18
|
+
"ExecutionTime"=>"0.01",
|
19
|
+
"xmlns"=>"http://api.namecheap.com/xml.response"}}
|
20
|
+
|
21
|
+
@response = NamecheapDomainCheckResponse.new(@domain_check_response_hash)
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have a domain check result" do
|
26
|
+
@response.items.length.should == 3
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should report that domain1.com is available" do
|
30
|
+
@response.items[1].available.should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should report that domain2.com is not available" do
|
34
|
+
@response.items[2].available.should be_false
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should report errors if there are any" do
|
38
|
+
@response.items[0].error.should == "750"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should include a description if there are errors" do
|
42
|
+
@response.items[0].description == "No response from the registry"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "failure response from namecheap" do
|
47
|
+
before(:each) do
|
48
|
+
@bad_response_hash = {"ApiResponse"=>{"Status"=>"ERROR",
|
49
|
+
"Errors"=>{"Error"=>"API Key is invalid or API access has not been enabled"},
|
50
|
+
"GMTTimeDifference"=>"--6:00",
|
51
|
+
"RequestedCommand"=>"namecheap.domains.check",
|
52
|
+
"Server"=>"SERVER159",
|
53
|
+
"ExecutionTime"=>"0.01",
|
54
|
+
"xmlns"=>"http://api.namecheap.com/xml.response"}}
|
55
|
+
|
56
|
+
|
57
|
+
it "should return false if bad hash is returned" do
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#<?xml version="1.0" encoding="utf-8"?>
|
65
|
+
# <ApiResponse Status="OK" xmlns="http://api.namecheap.com/xml.response">
|
66
|
+
# <Errors />
|
67
|
+
# <RequestedCommand>namecheap.domains.check</RequestedCommand>
|
68
|
+
# <CommandResponse Type="namecheap.domains.check">
|
69
|
+
# <DomainCheckResult Domain="domain1.com" Available="true" />
|
70
|
+
# <DomainCheckResult Domain="availabledomain.com" Available="false" />
|
71
|
+
# <DomainCheckResult Domain="err.tld" Available="error" ErrorNo="750" Description="No response from the registry" />
|
72
|
+
# </CommandResponse>
|
73
|
+
# <Server>SERVER-NAME</Server>
|
74
|
+
# <GMTTimeDifference>+5</GMTTimeDifference>
|
75
|
+
# <ExecutionTime>32.76</ExecutionTime>
|
76
|
+
#</ApiResponse>
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/namecheap'
|
3
|
+
|
4
|
+
describe NamecheapResponse do
|
5
|
+
before(:each) do
|
6
|
+
@bad_response_hash = {"ApiResponse"=>{"Status"=>"ERROR",
|
7
|
+
"Errors"=>{"Error"=>"API Key is invalid or API access has not been enabled"},
|
8
|
+
"GMTTimeDifference"=>"--6:00",
|
9
|
+
"RequestedCommand"=>"namecheap.domains.check",
|
10
|
+
"Server"=>"SERVER159",
|
11
|
+
"ExecutionTime"=>"0.01",
|
12
|
+
"xmlns"=>"http://api.namecheap.com/xml.response"}}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return a status" do
|
16
|
+
response = NamecheapResponse.new(@bad_response_hash)
|
17
|
+
response.status.should == "ERROR"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should give error message for invalid api key when using an invalid key" do
|
21
|
+
response = NamecheapResponse.new(@bad_response_hash)
|
22
|
+
response.message.should include("API Key is invalid")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/namecheap'
|
3
|
+
require 'mocha'
|
4
|
+
|
5
|
+
describe "NamecheapAPI Wrapper" do
|
6
|
+
describe "initializating settings" do
|
7
|
+
describe "with defaults" do
|
8
|
+
it "should contain a username" do
|
9
|
+
namecheap = Namecheap.new
|
10
|
+
namecheap.send(:username).should == 'apiuser'
|
11
|
+
end
|
12
|
+
it "should contain a key" do
|
13
|
+
namecheap = Namecheap.new
|
14
|
+
namecheap.send(:key).should == 'apikey'
|
15
|
+
end
|
16
|
+
it "should contain a client_ip" do
|
17
|
+
namecheap = Namecheap.new
|
18
|
+
namecheap.send(:client_ip).should == '127.0.0.1'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "with defaults overidden" do
|
23
|
+
it "shoud contain a overidden username" do
|
24
|
+
namecheap = Namecheap.new(:username => 'testuser')
|
25
|
+
namecheap.send(:username).should == 'testuser'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "shoud contain a key" do
|
29
|
+
namecheap = Namecheap.new(:key => 'testkey')
|
30
|
+
namecheap.send(:key).should == 'testkey'
|
31
|
+
end
|
32
|
+
it "shoud contain a client_ip" do
|
33
|
+
namecheap = Namecheap.new(:client_ip => '66.11.22.44')
|
34
|
+
namecheap.send(:client_ip).should == '66.11.22.44'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "Attempt to connect with bad credentials" do
|
40
|
+
it "should report an error on erroneous account information" do
|
41
|
+
namecheap = Namecheap.new
|
42
|
+
namecheap.domain_check("fakedomain").status.should == "ERROR"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should give error message for invalid api key when using an invalid key" do
|
46
|
+
namecheap = Namecheap.new
|
47
|
+
namecheap.domain_check("fakedomain").message.should include("API Key is invalid")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "Attempt to connect with valid credentials" do
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#domain_check" do
|
56
|
+
it "should build query with multiple domains" do
|
57
|
+
namecheap = Namecheap.new()
|
58
|
+
namecheap.expects(:do_query).with("namecheap.domains.check", "&DomainList=domain1.com,domain2.com")
|
59
|
+
namecheap.domain_check(['domain1.com','domain2.com'])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#is_domain_available?" do
|
64
|
+
it "should return false if connection fails" do
|
65
|
+
namecheap = Namecheap.new(:apikey => 'BADKEY')
|
66
|
+
lambda {
|
67
|
+
namecheap.is_domain_available?('fakedomain.tld').should be_false
|
68
|
+
}.should raise_error(NilNamecheapResponse)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return true if connections succeeds and domain is available" do
|
72
|
+
pending "Need API Access To Namecheap.com"
|
73
|
+
namecheap = Namecheap.new
|
74
|
+
namecheap.is_domain_available?('saucytuborswithashoefetish.com').should be_true
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return false if connections succeeds and domain is not available" do
|
78
|
+
namecheap = Namecheap.new
|
79
|
+
lambda {
|
80
|
+
namecheap.is_domain_available?('hashrocket.com').should be_false
|
81
|
+
}.should raise_error(NilNamecheapResponse)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: namecheap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- parasquid
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-10-07 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: httparty
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: Ruby wrapper for the Namecheap API
|
49
|
+
email:
|
50
|
+
- tristan.gomezd@gmail.com
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- .gitignore
|
59
|
+
- .rvmrc
|
60
|
+
- Gemfile
|
61
|
+
- README.textile
|
62
|
+
- Rakefile
|
63
|
+
- lib/namecheap.rb
|
64
|
+
- lib/namecheap.yml
|
65
|
+
- lib/namecheap/version.rb
|
66
|
+
- namecheap.gemspec
|
67
|
+
- spec/namecheap_domain_check_response_spec.rb
|
68
|
+
- spec/namecheap_response_spec.rb
|
69
|
+
- spec/namecheap_spec.rb
|
70
|
+
- spec/spec_helper.rb
|
71
|
+
homepage: https://github.com/parasquid/namecheap
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project: namecheap
|
100
|
+
rubygems_version: 1.8.10
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Ruby wrapper for the Namecheap API
|
104
|
+
test_files:
|
105
|
+
- spec/namecheap_domain_check_response_spec.rb
|
106
|
+
- spec/namecheap_response_spec.rb
|
107
|
+
- spec/namecheap_spec.rb
|
108
|
+
- spec/spec_helper.rb
|