dnsimple-ruby 0.4.1 → 0.5.0

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2010 Aetrion LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
data/README.textile CHANGED
@@ -16,11 +16,16 @@ In this file add the following:
16
16
  password: YOUR_PASSWORD
17
17
  </code></pre>
18
18
 
19
+ Alternatively you can pass the credentials via command-line arguments, as in:
20
+
21
+ <pre><code>dnsimple -u username -p password list</code></pre>
22
+
19
23
  h2. Commands
20
24
 
21
25
  There are two ways to interact with the DNSimple Ruby wrapper. The first is
22
- to use the command line utility that is included. The commands available
23
- are as follows:
26
+ to use the command line utility that is included.
27
+
28
+ The commands available are as follows:
24
29
 
25
30
  For help:
26
31
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.5.0
data/bin/dnsimple.rb CHANGED
@@ -20,6 +20,10 @@ directory and add the following to that file:
20
20
  username: YOUR_USERNAME
21
21
  password: YOUR_PASSWORD
22
22
 
23
+ Alternatively you can pass the credentials via command-line arguments, as in:
24
+
25
+ dnsimple -u username -p password command
26
+
23
27
  == Commands
24
28
 
25
29
  All commands are executed as dnsimple [options] command [command-options] args
@@ -30,17 +34,28 @@ The following commands are available:
30
34
  help # Show this usage
31
35
  info # Show your account information
32
36
 
33
- list # List all domains
37
+ list # List all domains
38
+ describe domain.com # Describe the given domain
39
+ create [--template=short_name] domain.com # Add the given domain
40
+ register [--template=short_name] domain.com registrant_id # Register the given domain with DNSimple
41
+ transfer domain.com registrant_id [authinfo] # Transfer the given domain into DNSimple
42
+ delete domain.com # Delete the given domain
43
+ apply domain.com template_short_name # Apply a template to the domain
44
+
45
+ record:create [--prio=priority] domain.com name type \\
46
+ content [ttl] # Create the DNS record on the domain
47
+ record:list domain.com # List all records for the domain
48
+ record:delete domain.com record_id # Delete the given domain
49
+
50
+ template:create name short_name [description] # Create a template
51
+ template:list # List all templates
52
+ template:delete short_name # Delete the given template
34
53
 
35
- describe domain.com # Describe the given domain
36
- create domain.com # Add the given domain
37
- delete domain.com # Delete the given domain
38
- apply domain.com template_short_name # Apply a template to the domain
54
+ template:list_records short_name # List all of the records for a template
55
+ template:add_record [--prio=priority] short_name name \\
56
+ type content [ttl] # Add a template record to the given template
57
+ template:delete_record short_name template_record_id # Delete the given template record
39
58
 
40
- record:create [--prio=priority] \\
41
- domain.com name type content [ttl] # Create the DNS record on the domain
42
- record:list domain.com # List all records for the domain
43
- record:delete domain.com record_id # Delete the given domain
44
59
 
45
60
  EOF
46
61
  end
@@ -57,18 +72,31 @@ global = OptionParser.new do |opts|
57
72
  opts.on("-p", "--password [ARG]") do |password|
58
73
  DNSimple::Client.password = password
59
74
  end
75
+ opts.on("-d") do
76
+ DNSimple::Client.debug = true
77
+ end
60
78
  end
61
79
 
62
80
  subcommands = {
63
81
  'create' => OptionParser.new do |opts|
64
- opts.on("--template [ARG]") do |opt|
65
- options[:template] = opt
66
- end
67
- end,
82
+ opts.on("--template [ARG]") do |opt|
83
+ options[:template] = opt
84
+ end
85
+ end,
86
+ 'register' => OptionParser.new do |opts|
87
+ opts.on("--template [ARG]") do |opt|
88
+ options[:template] = opt
89
+ end
90
+ end,
68
91
  'record:create' => OptionParser.new do |opts|
69
- opts.on("--prio [ARG]") do |prio|
70
- options[:prio] = prio
71
- end
92
+ opts.on("--prio [ARG]") do |prio|
93
+ options[:prio] = prio
94
+ end
95
+ end,
96
+ 'template:add_record' => OptionParser.new do |opts|
97
+ opts.on("--prio [ARG]") do |prio|
98
+ options[:prio] = prio
99
+ end
72
100
  end,
73
101
  }
74
102
 
data/lib/dnsimple.rb CHANGED
@@ -8,3 +8,5 @@ require 'dnsimple/user'
8
8
  require 'dnsimple/domain'
9
9
  require 'dnsimple/record'
10
10
  require 'dnsimple/template'
11
+ require 'dnsimple/template_record'
12
+ require 'dnsimple/transfer_order'
data/lib/dnsimple/cli.rb CHANGED
@@ -32,6 +32,8 @@ module DNSimple
32
32
  'info' => DNSimple::Commands::DescribeUser,
33
33
 
34
34
  'create' => DNSimple::Commands::CreateDomain,
35
+ 'register' => DNSimple::Commands::RegisterDomain,
36
+ 'transfer' => DNSimple::Commands::TransferDomain,
35
37
  'describe' => DNSimple::Commands::DescribeDomain,
36
38
  'list' => DNSimple::Commands::ListDomains,
37
39
  'delete' => DNSimple::Commands::DeleteDomain,
@@ -41,6 +43,14 @@ module DNSimple
41
43
  'record:create' => DNSimple::Commands::CreateRecord,
42
44
  'record:list' => DNSimple::Commands::ListRecords,
43
45
  'record:delete' => DNSimple::Commands::DeleteRecord,
46
+
47
+ 'template:create' => DNSimple::Commands::CreateTemplate,
48
+ 'template:list' => DNSimple::Commands::ListTemplates,
49
+ 'template:delete' => DNSimple::Commands::DeleteTemplate,
50
+
51
+ 'template:list_records' => DNSimple::Commands::ListTemplateRecords,
52
+ 'template:add_record' => DNSimple::Commands::AddTemplateRecord,
53
+ 'template:delete_record' => DNSimple::Commands::DeleteTemplateRecord,
44
54
  }
45
55
  end
46
56
 
@@ -53,6 +63,8 @@ end
53
63
 
54
64
  require 'dnsimple/commands/describe_user'
55
65
  require 'dnsimple/commands/create_domain'
66
+ require 'dnsimple/commands/register_domain'
67
+ require 'dnsimple/commands/transfer_domain'
56
68
  require 'dnsimple/commands/describe_domain'
57
69
  require 'dnsimple/commands/list_domains'
58
70
  require 'dnsimple/commands/delete_domain'
@@ -62,3 +74,10 @@ require 'dnsimple/commands/apply_template'
62
74
  require 'dnsimple/commands/create_record'
63
75
  require 'dnsimple/commands/list_records'
64
76
  require 'dnsimple/commands/delete_record'
77
+
78
+ require 'dnsimple/commands/create_template'
79
+ require 'dnsimple/commands/list_templates'
80
+ require 'dnsimple/commands/delete_template'
81
+ require 'dnsimple/commands/list_template_records'
82
+ require 'dnsimple/commands/add_template_record'
83
+ require 'dnsimple/commands/delete_template_record'
@@ -0,0 +1,18 @@
1
+ module DNSimple
2
+ module Commands
3
+ class AddTemplateRecord
4
+ def execute(args, options={})
5
+ short_name = args.shift
6
+ record_name = args.shift
7
+ record_type = args.shift
8
+ content = args.shift
9
+ ttl = args.shift
10
+
11
+ template = Template.find(short_name)
12
+ record = TemplateRecord.create(template.short_name, record_name, record_type, content, :ttl => ttl, :prio => options[:prio])
13
+
14
+ puts "Created #{record.record_type} with content '#{record.content}' record for template #{template.name}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module DNSimple
2
+ module Commands
3
+ class CreateTemplate
4
+ def execute(args, options={})
5
+ name = args.shift
6
+ short_name = args.shift
7
+ description = args.shift unless args.empty?
8
+
9
+ template = Template.create(name, short_name, description)
10
+ puts "Created #{template.name} (short_name:#{template.short_name})"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module DNSimple
2
+ module Commands
3
+ class DeleteTemplate
4
+ def execute(args, options={})
5
+ short_name = args.shift
6
+ template = Template.find(short_name)
7
+ template.delete
8
+
9
+ puts "Deleted template #{short_name}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module DNSimple
2
+ module Commands
3
+ class DeleteTemplateRecord
4
+ def execute(args, options={})
5
+ short_name = args.shift
6
+ id = args.shift
7
+
8
+ template = Template.find(short_name)
9
+ record = TemplateRecord.find(template.short_name, id)
10
+ record.delete
11
+
12
+ puts "Deleted #{record.id} from template #{short_name}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module DNSimple
2
+ module Commands
3
+ class ListTemplateRecords
4
+ def execute(args, options={})
5
+ short_name = args.shift
6
+ template_records = TemplateRecord.all(short_name)
7
+ puts "Found #{template_records.length} records for #{short_name}"
8
+ template_records.each do |record|
9
+ extra = ["ttl:#{record.ttl}", "id:#{record.id}"]
10
+ extra << "prio:#{record.prio}" if record.record_type == "MX"
11
+ extra = "(#{extra.join(', ')})"
12
+ puts "\t#{record.name} (#{record.record_type})-> #{record.content} #{extra}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module DNSimple
2
+ module Commands
3
+ class ListTemplates
4
+ def execute(args, options={})
5
+ templates = Template.all
6
+ puts "Found #{templates.length} templates:"
7
+ templates.each do |template|
8
+ puts "\t#{template.name} (short_name:#{template.short_name})"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module DNSimple
2
+ module Commands
3
+ class RegisterDomain
4
+ def execute(args, options={})
5
+ name = args.shift
6
+ registrant = {:id => args.shift}
7
+ domain = Domain.register(name, registrant)
8
+ puts "Registered #{domain.name}"
9
+
10
+ if template = options.delete(:template)
11
+ domain.apply(template)
12
+ puts "Applied template #{template} to #{domain.name}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module DNSimple
2
+ module Commands
3
+ class TransferDomain
4
+ def execute(args, options={})
5
+ name = args.shift
6
+ registrant = {:id => args.shift}
7
+ authinfo = args.shift unless args.empty?
8
+ authinfo ||= ''
9
+
10
+ transfer_order = TransferOrder.create(name, authinfo, registrant)
11
+ puts "Transfer order issued for #{name}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -42,7 +42,7 @@ module DNSimple #:nodoc:
42
42
 
43
43
  # Create the domain with the given name in DNSimple. This
44
44
  # method returns a Domain instance if the name is created
45
- # and raises
45
+ # and raises an error otherwise.
46
46
  def self.create(name, options={})
47
47
  domain_hash = {:name => name}
48
48
 
@@ -63,6 +63,34 @@ module DNSimple #:nodoc:
63
63
  end
64
64
  end
65
65
 
66
+ def self.register(name, registrant={}, extended_attributes={}, options={})
67
+ body = {:domain => {:name => name}}
68
+
69
+ if registrant[:id]
70
+ body[:domain][:registrant_id] = registrant[:id]
71
+ else
72
+ body.merge!(:contact => registrant)
73
+ end
74
+
75
+ body.merge!(:extended_attribute => extended_attributes)
76
+
77
+ options.merge!({:body => body})
78
+ options.merge!({:basic_auth => Client.credentials})
79
+
80
+ response = self.post("#{Client.base_uri}/domain_registrations.json", options)
81
+
82
+ pp response if Client.debug?
83
+
84
+ case response.code
85
+ when 201
86
+ return Domain.new(response["domain"])
87
+ when 401
88
+ raise RuntimeError, "Authentication failed"
89
+ else
90
+ raise DNSimple::Error.new(name, response["errors"])
91
+ end
92
+ end
93
+
66
94
  def self.find(id_or_name, options={})
67
95
  options.merge!({:basic_auth => Client.credentials})
68
96
  response = self.get("#{Client.base_uri}/domains/#{id_or_name}.json", options)
@@ -21,6 +21,38 @@ module DNSimple
21
21
  self.send(m, value) if self.respond_to?(m)
22
22
  end
23
23
  end
24
+
25
+ # Delete the template from DNSimple. WARNING: this cannot
26
+ # be undone.
27
+ def delete(options={})
28
+ options.merge!({:basic_auth => Client.credentials})
29
+ self.class.delete("#{Client.base_uri}/templates/#{id}.json", options)
30
+ end
31
+ alias :destroy :delete
32
+
33
+ def self.create(name, short_name, description=nil, options={})
34
+ template_hash = {
35
+ :name => name,
36
+ :short_name => short_name,
37
+ :description => description
38
+ }
39
+
40
+ options.merge!(:body => {:dns_template => template_hash})
41
+ options.merge!({:basic_auth => Client.credentials})
42
+
43
+ response = self.post("#{Client.base_uri}/templates.json", options)
44
+
45
+ pp response if Client.debug?
46
+
47
+ case response.code
48
+ when 201
49
+ return Template.new(response["dns_template"])
50
+ when 401
51
+ raise RuntimeError, "Authentication failed"
52
+ else
53
+ raise DNSimple::Error.new(name, response["errors"])
54
+ end
55
+ end
24
56
 
25
57
  def self.find(id_or_short_name, options={})
26
58
  options.merge!({:basic_auth => Client.credentials})
@@ -39,5 +71,21 @@ module DNSimple
39
71
  raise DNSimple::Error.new(id_or_short_name, response["errors"])
40
72
  end
41
73
  end
74
+
75
+ def self.all(options={})
76
+ options.merge!({:basic_auth => Client.credentials})
77
+ response = self.get("#{Client.base_uri}/templates.json", options)
78
+
79
+ pp response if Client.debug?
80
+
81
+ case response.code
82
+ when 200
83
+ response.map { |r| Template.new(r["dns_template"]) }
84
+ when 401
85
+ raise RuntimeError, "Authentication failed"
86
+ else
87
+ raise RuntimeError, "Error: #{response.code}"
88
+ end
89
+ end
42
90
  end
43
91
  end
@@ -0,0 +1,103 @@
1
+ module DNSimple #:nodoc:
2
+ # A single record in a template
3
+ class TemplateRecord
4
+ include HTTParty
5
+
6
+ # The id of the template record
7
+ attr_accessor :id
8
+
9
+ # The template the record belongs to
10
+ attr_accessor :template
11
+
12
+ # The name the record points to. This may be blank.
13
+ attr_accessor :name
14
+
15
+ # The content for the record.
16
+ attr_accessor :content
17
+
18
+ # The record type
19
+ attr_accessor :record_type
20
+
21
+ # The time-to-live
22
+ attr_accessor :ttl
23
+
24
+ # The priority (only for MX records)
25
+ attr_accessor :prio
26
+
27
+ #:nodoc:
28
+ def initialize(attributes)
29
+ attributes.each do |key, value|
30
+ m = "#{key}=".to_sym
31
+ self.send(m, value) if self.respond_to?(m)
32
+ end
33
+ end
34
+
35
+ def delete(options={})
36
+ options.merge!(:basic_auth => Client.credentials)
37
+ self.class.delete("#{Client.base_uri}/templates/#{template.id}/template_records/#{id}.json", options)
38
+ end
39
+ alias :destroy :delete
40
+
41
+ def self.create(short_name, name, record_type, content, options={})
42
+ template = Template.find(short_name)
43
+
44
+ record_hash = {:name => name, :record_type => record_type, :content => content}
45
+ record_hash[:ttl] = options.delete(:ttl) || 3600
46
+ record_hash[:prio] = options.delete(:prio) || ''
47
+
48
+ options.merge!({:query => {:dns_template_record => record_hash}})
49
+ options.merge!({:basic_auth => Client.credentials})
50
+
51
+ response = self.post("#{Client.base_uri}/templates/#{template.id}/template_records.json", options)
52
+
53
+ pp response if Client.debug?
54
+
55
+ case response.code
56
+ when 201
57
+ return TemplateRecord.new({:template => template}.merge(response["dns_template_record"]))
58
+ when 401
59
+ raise RuntimeError, "Authentication failed"
60
+ else
61
+ raise DNSimple::Error.new("#{name}", response["errors"])
62
+ end
63
+ end
64
+
65
+ def self.find(short_name, id, options={})
66
+ template = Template.find(short_name)
67
+ options.merge!(:basic_auth => Client.credentials)
68
+ response = self.get("#{Client.base_uri}/templates/#{template.id}/template_records/#{id}.json", options)
69
+
70
+ pp response if Client.debug?
71
+
72
+ case response.code
73
+ when 200
74
+ return TemplateRecord.new({:template => template}.merge(response["dns_template_record"]))
75
+ when 401
76
+ raise RuntimeError, "Authentication failed"
77
+ when 404
78
+ raise RuntimeError, "Could not find template record #{id} for template #{short_name}"
79
+ end
80
+ end
81
+
82
+ # Get all of the template records for the template with the
83
+ # given short name.
84
+ def self.all(short_name, options={})
85
+ template = Template.find(short_name)
86
+ options.merge!({:basic_auth => Client.credentials})
87
+ response = self.get("#{Client.base_uri}/templates/#{template.id}/template_records.json", options)
88
+
89
+ pp response if Client.debug?
90
+
91
+ case response.code
92
+ when 200
93
+ response.map { |r| TemplateRecord.new({:template => template}.merge(r["dns_template_record"])) }
94
+ when 401
95
+ raise RuntimeError, "Authentication failed"
96
+ else
97
+ raise RuntimeError, "Error: #{response.code}"
98
+ end
99
+ end
100
+ end
101
+
102
+
103
+ end
@@ -0,0 +1,45 @@
1
+ module DNSimple #:nodoc:
2
+ # Class representing a transfer order in DNSimple
3
+ class TransferOrder
4
+ include HTTParty
5
+
6
+ attr_accessor :id
7
+
8
+ attr_accessor :status
9
+
10
+ def initialize(attributes)
11
+ attributes.each do |key, value|
12
+ m = "#{key}=".to_sym
13
+ self.send(m, value) if self.respond_to?(m)
14
+ end
15
+ end
16
+
17
+ def self.create(name, authinfo='', registrant={}, extended_attributes={}, options={})
18
+ body = {:domain => {:name => name}, :transfer_order => {:authinfo => authinfo}}
19
+
20
+ if registrant[:id]
21
+ body[:domain][:registrant_id] = registrant[:id]
22
+ else
23
+ body.merge!(:contact => registrant)
24
+ end
25
+
26
+ body.merge!(:extended_attribute => extended_attributes)
27
+
28
+ options.merge!({:body => body})
29
+ options.merge!({:basic_auth => Client.credentials})
30
+
31
+ response = self.post("#{Client.base_uri}/domain_transfers.json", options)
32
+
33
+ pp response if Client.debug?
34
+
35
+ case response.code
36
+ when 201
37
+ return TransferOrder.new(response["transfer_order"])
38
+ when 401
39
+ raise RuntimeError, "Authentication failed"
40
+ else
41
+ raise DNSimple::Error.new(name, response["errors"])
42
+ end
43
+ end
44
+ end
45
+ end
data/spec/domain_spec.rb CHANGED
@@ -25,6 +25,35 @@ describe DNSimple::Domain do
25
25
  end
26
26
  end
27
27
 
28
+ context "registration" do
29
+ describe "a new domain" do
30
+ context "with an existing contact" do
31
+ let(:name) { "testdomain-#{Time.now.to_i}.net" }
32
+ let(:registrant) { Hash.new(:id => 4) }
33
+ it "can be registered" do
34
+ domain = DNSimple::Domain.register(name, registrant)
35
+ domain.name.should eql(name)
36
+ end
37
+ end
38
+ context "with a new registrant contact" do
39
+ let(:name) { "testdomain-#{Time.now.to_i}.net" }
40
+ it "can be registered" do
41
+ registrant = {
42
+ :first_name => 'John',
43
+ :last_name => 'Smith',
44
+ :address1 => '123 SW 1st Street',
45
+ :city => 'Miami',
46
+ :state_or_province => 'FL',
47
+ :country => 'US',
48
+ :postal_code => '33143'
49
+ }
50
+ domain = DNSimple::Domain.register(name, registrant)
51
+ domain.name.should eql(name)
52
+ end
53
+ end
54
+ end
55
+ end
56
+
28
57
  describe ".all" do
29
58
  before do
30
59
  @domains = []
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
8
- - 1
9
- version: 0.4.1
7
+ - 5
8
+ - 0
9
+ version: 0.5.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Anthony Eden
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-18 00:00:00 -10:00
17
+ date: 2010-09-30 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -37,11 +37,13 @@ executables:
37
37
  extensions: []
38
38
 
39
39
  extra_rdoc_files:
40
+ - LICENSE
40
41
  - README
41
42
  - README.rdoc
42
43
  - README.textile
43
44
  files:
44
45
  - .gitignore
46
+ - LICENSE
45
47
  - README
46
48
  - README.rdoc
47
49
  - README.textile
@@ -52,20 +54,30 @@ files:
52
54
  - lib/dnsimple.rb
53
55
  - lib/dnsimple/cli.rb
54
56
  - lib/dnsimple/client.rb
57
+ - lib/dnsimple/commands/add_template_record.rb
55
58
  - lib/dnsimple/commands/apply_template.rb
56
59
  - lib/dnsimple/commands/clear_domain.rb
57
60
  - lib/dnsimple/commands/create_domain.rb
58
61
  - lib/dnsimple/commands/create_record.rb
62
+ - lib/dnsimple/commands/create_template.rb
59
63
  - lib/dnsimple/commands/delete_domain.rb
60
64
  - lib/dnsimple/commands/delete_record.rb
65
+ - lib/dnsimple/commands/delete_template.rb
66
+ - lib/dnsimple/commands/delete_template_record.rb
61
67
  - lib/dnsimple/commands/describe_domain.rb
62
68
  - lib/dnsimple/commands/describe_user.rb
63
69
  - lib/dnsimple/commands/list_domains.rb
64
70
  - lib/dnsimple/commands/list_records.rb
71
+ - lib/dnsimple/commands/list_template_records.rb
72
+ - lib/dnsimple/commands/list_templates.rb
73
+ - lib/dnsimple/commands/register_domain.rb
74
+ - lib/dnsimple/commands/transfer_domain.rb
65
75
  - lib/dnsimple/domain.rb
66
76
  - lib/dnsimple/error.rb
67
77
  - lib/dnsimple/record.rb
68
78
  - lib/dnsimple/template.rb
79
+ - lib/dnsimple/template_record.rb
80
+ - lib/dnsimple/transfer_order.rb
69
81
  - lib/dnsimple/user.rb
70
82
  - spec/README
71
83
  - spec/domain_spec.rb