dnsimple-ruby 0.4.1 → 0.5.0

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