gandi_v5 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +1 -0
- data/CHANGELOG.md +44 -2
- data/Guardfile +5 -6
- data/README.md +5 -5
- data/doc/GandiV5/Billing/Info/Prepaid.html +817 -0
- data/doc/GandiV5/Billing/Info.html +641 -0
- data/doc/GandiV5/Billing.html +293 -0
- data/doc/GandiV5/Data/ClassMethods.html +223 -0
- data/doc/GandiV5/Data/Converter/ArrayOf.html +413 -0
- data/doc/GandiV5/Data/Converter/Symbol.html +322 -0
- data/doc/GandiV5/Data/Converter/Time.html +330 -0
- data/doc/GandiV5/Data/Converter.html +433 -0
- data/doc/GandiV5/Data.html +785 -0
- data/doc/GandiV5/Domain/AutoRenew.html +1237 -0
- data/doc/GandiV5/Domain/Availability/Product/Period.html +220 -0
- data/doc/GandiV5/Domain/Availability/Product/Price.html +1031 -0
- data/doc/GandiV5/Domain/Availability/Product.html +988 -0
- data/doc/GandiV5/Domain/Availability/Tax.html +440 -0
- data/doc/GandiV5/Domain/Availability.html +1020 -0
- data/doc/GandiV5/Domain/Contact.html +4459 -0
- data/doc/GandiV5/Domain/Contract.html +520 -0
- data/doc/GandiV5/Domain/Dates.html +1313 -0
- data/doc/GandiV5/Domain/RenewalInformation.html +1147 -0
- data/doc/GandiV5/Domain/RestoreInformation.html +339 -0
- data/doc/GandiV5/Domain/SharingSpace.html +437 -0
- data/doc/GandiV5/Domain/TLD.html +1565 -0
- data/doc/GandiV5/Domain.html +16847 -0
- data/doc/GandiV5/Email/Mailbox/Responder.html +1560 -0
- data/doc/GandiV5/Email/Mailbox.html +6307 -0
- data/doc/GandiV5/Email/Offer.html +514 -0
- data/doc/GandiV5/Email/Slot.html +4244 -0
- data/doc/GandiV5/Email.html +144 -0
- data/doc/GandiV5/Error/GandiError.html +270 -0
- data/doc/GandiV5/Error.html +151 -0
- data/doc/GandiV5/LiveDNS/Domain.html +2984 -0
- data/doc/GandiV5/LiveDNS/RecordSet.html +1593 -0
- data/doc/GandiV5/LiveDNS/Zone/Snapshot.html +1556 -0
- data/doc/GandiV5/LiveDNS/Zone.html +8891 -0
- data/doc/GandiV5/LiveDNS.html +300 -0
- data/doc/GandiV5/Organization.html +2341 -0
- data/doc/GandiV5.html +1183 -0
- data/doc/_index.html +474 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +175 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +175 -0
- data/doc/js/app.js +303 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +2427 -0
- data/doc/top-level-namespace.html +110 -0
- data/gandi_v5.gemspec +1 -1
- data/lib/gandi_v5/billing.rb +2 -2
- data/lib/gandi_v5/data.rb +2 -0
- data/lib/gandi_v5/domain/auto_renew.rb +4 -4
- data/lib/gandi_v5/domain/availability/product/period.rb +24 -0
- data/lib/gandi_v5/domain/availability/product/price.rb +36 -0
- data/lib/gandi_v5/domain/availability/product.rb +52 -0
- data/lib/gandi_v5/domain/availability/tax.rb +20 -0
- data/lib/gandi_v5/domain/availability.rb +49 -0
- data/lib/gandi_v5/domain/tld.rb +57 -0
- data/lib/gandi_v5/domain.rb +41 -86
- data/lib/gandi_v5/email/mailbox/responder.rb +43 -2
- data/lib/gandi_v5/email/mailbox.rb +32 -21
- data/lib/gandi_v5/email/offer.rb +2 -2
- data/lib/gandi_v5/email/slot.rb +42 -16
- data/lib/gandi_v5/error/gandi_error.rb +2 -2
- data/lib/gandi_v5/live_dns/domain.rb +59 -45
- data/lib/gandi_v5/live_dns/zone/snapshot.rb +27 -8
- data/lib/gandi_v5/live_dns/zone.rb +63 -59
- data/lib/gandi_v5/live_dns.rb +20 -0
- data/lib/gandi_v5/organization.rb +2 -2
- data/lib/gandi_v5/version.rb +1 -1
- data/lib/gandi_v5.rb +25 -5
- data/spec/features/domain_spec.rb +1 -1
- data/spec/fixtures/bodies/{GandiV5_Domain/availability.yaml → GandiV5_Domain_Availability/fetch.yaml} +0 -0
- data/spec/fixtures/bodies/{GandiV5_Domain/tld.yaml → GandiV5_Domain_TLD/fetch.yaml} +0 -0
- data/spec/fixtures/bodies/{GandiV5_Domain/tlds.yaml → GandiV5_Domain_TLD/list.yaml} +0 -0
- data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/{get.yaml → fetch.yaml} +0 -0
- data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/list.yaml +3 -0
- data/spec/units/gandi_v5/billing_spec.rb +2 -2
- data/spec/units/gandi_v5/domain/auto_renew_spec.rb +5 -5
- data/spec/units/gandi_v5/domain/availability/product/period_spec.rb +4 -0
- data/spec/units/gandi_v5/domain/availability/product/price_spec.rb +4 -0
- data/spec/units/gandi_v5/domain/availability/product_spec.rb +4 -0
- data/spec/units/gandi_v5/domain/availability/tax_spec.rb +4 -0
- data/spec/units/gandi_v5/domain/availability_spec.rb +43 -0
- data/spec/units/gandi_v5/domain/tld_spec.rb +29 -0
- data/spec/units/gandi_v5/domain_spec.rb +89 -81
- data/spec/units/gandi_v5/email/mailbox/responder_spec.rb +52 -0
- data/spec/units/gandi_v5/email/mailbox_spec.rb +56 -27
- data/spec/units/gandi_v5/email/offer_spec.rb +1 -1
- data/spec/units/gandi_v5/email/slot_spec.rb +101 -13
- data/spec/units/gandi_v5/live_dns/domain_spec.rb +70 -40
- data/spec/units/gandi_v5/live_dns/zone/snapshot_spec.rb +32 -3
- data/spec/units/gandi_v5/live_dns/zone_spec.rb +68 -50
- data/spec/units/gandi_v5/live_dns_spec.rb +24 -0
- data/spec/units/gandi_v5/organization_spec.rb +1 -1
- data/spec/units/gandi_v5_spec.rb +37 -12
- metadata +72 -9
- data/TODO.md +0 -29
@@ -0,0 +1,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.19
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
<strong class="classes">Classes:</strong> <span class='object_link'><a href="GandiV5.html" title="GandiV5 (class)">GandiV5</a></span>
|
88
|
+
|
89
|
+
|
90
|
+
</p>
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<div id="footer">
|
103
|
+
Generated on Mon Jul 22 16:44:23 2019 by
|
104
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
|
+
0.9.19 (ruby-2.6.3).
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
data/gandi_v5.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
|
|
32
32
|
gem.add_development_dependency 'rb-inotify', '~> 0.9'
|
33
33
|
gem.add_development_dependency 'rspec', '>= 3.7', '< 4'
|
34
34
|
gem.add_development_dependency 'rspec-its', '~> 1.3'
|
35
|
-
gem.add_development_dependency 'rubocop', '~> 0.
|
35
|
+
gem.add_development_dependency 'rubocop', '~> 0.73'
|
36
36
|
gem.add_development_dependency 'rubocop-performance', '~> 1.1'
|
37
37
|
gem.add_development_dependency 'simplecov', '~> 0.7'
|
38
38
|
gem.add_development_dependency 'timecop', '~> 0.5'
|
data/lib/gandi_v5/billing.rb
CHANGED
@@ -11,9 +11,9 @@ class GandiV5
|
|
11
11
|
# @param url [sharing_id] the Sharing ID of the organisation to get info for
|
12
12
|
# defaults to the user the api key belomgs to.
|
13
13
|
# @return [GandiV5::Billing::Info]
|
14
|
-
# @raise [GandiV5::Error::GandiError
|
14
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
15
15
|
def self.info(sharing_id = nil)
|
16
|
-
data = GandiV5.get url(sharing_id)
|
16
|
+
_response, data = GandiV5.get url(sharing_id)
|
17
17
|
GandiV5::Billing::Info.from_gandi data
|
18
18
|
end
|
19
19
|
|
data/lib/gandi_v5/data.rb
CHANGED
@@ -181,7 +181,9 @@ class GandiV5
|
|
181
181
|
define_method "#{name}=" do |value|
|
182
182
|
instance_variable_set("@#{name}", value)
|
183
183
|
end
|
184
|
+
# rubocop:disable Style/AccessModifierDeclarations
|
184
185
|
private "#{name}="
|
186
|
+
# rubocop:enable Style/AccessModifierDeclarations
|
185
187
|
end
|
186
188
|
|
187
189
|
# @api private
|
@@ -21,10 +21,10 @@ class GandiV5
|
|
21
21
|
|
22
22
|
# Disable auto renewal for the associated domain.
|
23
23
|
# @return [String] The confirmation message from Gandi.
|
24
|
-
# @raise [GandiV5::Error::GandiError
|
24
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
25
25
|
def disable
|
26
26
|
body = { enabled: false }.to_json
|
27
|
-
data = GandiV5.patch url, body
|
27
|
+
_response, data = GandiV5.patch url, body
|
28
28
|
self.enabled = false
|
29
29
|
data['message']
|
30
30
|
end
|
@@ -35,7 +35,7 @@ class GandiV5
|
|
35
35
|
# @return [String] The confirmation message from Gandi.
|
36
36
|
# @raise [ArgumentError] if duration is invalid (not 1 to 9 (inclusive)).
|
37
37
|
# @raise [ArgumentError] if org_id is not passed and not set for this domain.
|
38
|
-
# @raise [GandiV5::Error::GandiError
|
38
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
39
39
|
def enable(duration: self.duration || 1, org_id: self.org_id)
|
40
40
|
fail ArgumentError, 'duration can not be less than 1' if duration < 1
|
41
41
|
fail ArgumentError, 'duration can not be more than 9' if duration > 9
|
@@ -47,7 +47,7 @@ class GandiV5
|
|
47
47
|
org_id: org_id
|
48
48
|
}.to_json
|
49
49
|
|
50
|
-
data = GandiV5.patch url, body
|
50
|
+
_response, data = GandiV5.patch url, body
|
51
51
|
self.enabled = true
|
52
52
|
self.duration = duration
|
53
53
|
self.org_id = org_id
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class GandiV5
|
4
|
+
class Domain
|
5
|
+
class Availability
|
6
|
+
class Product
|
7
|
+
# Information about an available product.
|
8
|
+
# @!attribute [r] name
|
9
|
+
# @return [String]
|
10
|
+
# @!attribute [r]
|
11
|
+
# @return [Time] starts_at
|
12
|
+
# @!attribute [r]
|
13
|
+
# @return [Time, nil] ends_at
|
14
|
+
class Period
|
15
|
+
include GandiV5::Data
|
16
|
+
|
17
|
+
members :name
|
18
|
+
member :starts_at, converter: GandiV5::Data::Converter::Time
|
19
|
+
member :ends_at, converter: GandiV5::Data::Converter::Time
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class GandiV5
|
4
|
+
class Domain
|
5
|
+
class Availability
|
6
|
+
class Product
|
7
|
+
# Information about an available product.
|
8
|
+
# @!attribute [r] duration_unit
|
9
|
+
# @return [String] time unit for the duration (e.g. y)
|
10
|
+
# @!attribute [r] max_duration
|
11
|
+
# @return [Integer] maximum duration for which this price unit applies
|
12
|
+
# @!attribute [r] min_duration
|
13
|
+
# @return [Integer] minimum duration for which this price unit applies.
|
14
|
+
# @!attribute [r] price_after_taxes
|
15
|
+
# @return [Numeric] pricing after tax is applied
|
16
|
+
# @!attribute [r] price_before_taxes
|
17
|
+
# @return [Numeric] pricing before tax is applied
|
18
|
+
# @!attribute [r] discount
|
19
|
+
# @return [Boolean, nil] whether a discount is active on this price unit
|
20
|
+
# @!attribute [r] normal_price_after_taxes
|
21
|
+
# @return [Numeric, nil] pricing after tax is applied, when no discount applies
|
22
|
+
# @!attribute [r] normal_price_before_taxes
|
23
|
+
# @return [Numeric, nil] pricing before tax is applied, when no discount applies
|
24
|
+
# @!attribute [r] type
|
25
|
+
# @return [String, nil]
|
26
|
+
class Price
|
27
|
+
include GandiV5::Data
|
28
|
+
|
29
|
+
members :duration_unit, :max_duration, :min_duration,
|
30
|
+
:price_after_taxes, :price_before_taxes,
|
31
|
+
:discount, :normal_price_after_taxes, :normal_price_after_taxes, :type
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'product/price'
|
4
|
+
require_relative 'product/period'
|
5
|
+
|
6
|
+
class GandiV5
|
7
|
+
class Domain
|
8
|
+
class Availability
|
9
|
+
# Information about an available product.
|
10
|
+
# @!attribute [r] name
|
11
|
+
# @return [String]
|
12
|
+
# @!attribute [r] prices
|
13
|
+
# @return [Array<GandiV5::Domain::Availability::Product::Price>]
|
14
|
+
# @!attribute [r] periods
|
15
|
+
# @return [Array<GandiV5::Domain::Availability::Product::Period>]
|
16
|
+
# @!attribute [r] taxes
|
17
|
+
# @return [Array<GandiV5::Domain::Availability::Tax>]
|
18
|
+
# @!attribute [r] process
|
19
|
+
# @return [Symbol]
|
20
|
+
# @!attribute [r] status
|
21
|
+
# @return [Symbol]
|
22
|
+
class Product
|
23
|
+
include GandiV5::Data
|
24
|
+
|
25
|
+
STATUSES = {
|
26
|
+
available: 'Domain name is available',
|
27
|
+
available_reserved: 'Domain name reserved under special conditions',
|
28
|
+
available_preorder: 'Domain name can be pre-ordered',
|
29
|
+
unavailable: 'Domain name is not available',
|
30
|
+
unavailable_premium: 'Domain name is not available',
|
31
|
+
unavailable_restricted: 'Domain name is not available (forbidden)',
|
32
|
+
error_invalid: 'Provided value is not a valid domain name',
|
33
|
+
error_refused: 'Service is temporarily down',
|
34
|
+
error_timeout: 'Service timed out, try the method again later',
|
35
|
+
error_unknown: 'Internal server error',
|
36
|
+
reserved_corporate: 'The TLD for the given domain name is reserved for ' \
|
37
|
+
'Gandi Corporate Services customers',
|
38
|
+
pending: 'Result is not yet ready, try the method again later',
|
39
|
+
error_eoi: 'The TLD for the given domain name is in an ' \
|
40
|
+
'Expression of Interest (EOI) period'
|
41
|
+
}.freeze
|
42
|
+
|
43
|
+
members :name
|
44
|
+
member :prices, converter: GandiV5::Domain::Availability::Product::Price, array: true
|
45
|
+
member :periods, converter: GandiV5::Domain::Availability::Product::Period, array: true
|
46
|
+
member :process, converter: GandiV5::Data::Converter::Symbol
|
47
|
+
member :status, converter: GandiV5::Data::Converter::Symbol
|
48
|
+
member :taxes, converter: GandiV5::Domain::Availability::Tax, array: true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class GandiV5
|
4
|
+
class Domain
|
5
|
+
class Availability
|
6
|
+
# Information about tax due on a process/product.
|
7
|
+
# @!attribute [r] name
|
8
|
+
# @return [String] name of the tax (e.g. VAT)
|
9
|
+
# @!attribute [r] rate
|
10
|
+
# @return [Numeric] percentage rate of the tax (e.g. 20)
|
11
|
+
# @!attribute [r] type
|
12
|
+
# @return [String] type of the tax (e.g. service)
|
13
|
+
class Tax
|
14
|
+
include GandiV5::Data
|
15
|
+
|
16
|
+
members :name, :rate, :type
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'availability/tax'
|
4
|
+
require_relative 'availability/product'
|
5
|
+
|
6
|
+
class GandiV5
|
7
|
+
class Domain
|
8
|
+
# Information about the availabillity of processes on a domain.
|
9
|
+
# @!attribute [r] currency
|
10
|
+
# @return [String]
|
11
|
+
# @!attribute [r] grid
|
12
|
+
# @return [String]
|
13
|
+
# @!attribute [r] products
|
14
|
+
# @return [Arrav<GandiV5::Domain::Availability::Product>]
|
15
|
+
# @!attribute [r] taxes
|
16
|
+
# @return [Array<GandiV5::Domain::Availability::Tax>]
|
17
|
+
class Availability
|
18
|
+
include GandiV5::Data
|
19
|
+
|
20
|
+
members :currency, :grid
|
21
|
+
member :products, converter: GandiV5::Domain::Availability::Product, array: true
|
22
|
+
member :taxes, converter: GandiV5::Domain::Availability::Tax, array: true
|
23
|
+
|
24
|
+
# Check domain availability and pricing.
|
25
|
+
# @see https://api.gandi.net/docs/domains#get-v5-domain-check
|
26
|
+
# @param fqdn [String, #to_s] the fully qualified domain name to check.
|
27
|
+
# @param country [String, #to_s] (optional)
|
28
|
+
# ISO country code for which taxes are to be applied.
|
29
|
+
# @param currency [String, #to_s] (optional) request price for a specific ISO currency code.
|
30
|
+
# @param duration_unit [String, #to_s] (optional) define the unit for max_duration.
|
31
|
+
# @param extension [String, #to_s] (optional) query a specific extension for product options.
|
32
|
+
# @param grid [String, #to_s] (optional) request price for a specific rate.
|
33
|
+
# @param lang [String, #to_s] (optional) language code.
|
34
|
+
# @param max_duration [Integer, #to_s] (optional)
|
35
|
+
# set a limit on the duration range for returned prices.
|
36
|
+
# @param period [String, #to_s] (optional) specific registration period to query.
|
37
|
+
# @param processes [Array<:create, :renew, :transfer etc.>] (optional default [:create])
|
38
|
+
# list of at least 1 process for which pricing is to be made.
|
39
|
+
# @param sharing_id [String, #to_s] (optional)
|
40
|
+
# organization for which the pricing is to be made.
|
41
|
+
# @return [GandiV5::Domain::Availability]
|
42
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
43
|
+
def self.fetch(fqdn, **options)
|
44
|
+
_response, data = GandiV5.get("#{BASE}domain/check", params: { name: fqdn }.merge(options))
|
45
|
+
GandiV5::Domain::Availability.from_gandi data
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class GandiV5
|
4
|
+
class Domain
|
5
|
+
# Information about a specific TLD (Top Level Domain).
|
6
|
+
# @!attribute [r] name
|
7
|
+
# @return [String]
|
8
|
+
# @!attribute [r] full_tld
|
9
|
+
# @return [String]
|
10
|
+
# @!attribute [r] authinfo_for_transfer
|
11
|
+
# @return [Boolean] whether authinfo is required for a transfer.
|
12
|
+
# @!attribute [r] category
|
13
|
+
# @return [String]
|
14
|
+
# @!attribute [r] change_owner
|
15
|
+
# @return [Boolean] whther changing owner is pemritted.
|
16
|
+
# @!attribute [r] corporate
|
17
|
+
# @return [Boolean] whether this is a corporate TLD.
|
18
|
+
# @!attribute [r] ext_trade
|
19
|
+
# @return [Boolean]
|
20
|
+
# @!attribute [r] lock
|
21
|
+
# @return [Boolean]
|
22
|
+
class TLD
|
23
|
+
include GandiV5::Data
|
24
|
+
|
25
|
+
members :name, :full_tld, :authinfo_for_transfer, :change_owner, :corporate, :ext_trade, :lock
|
26
|
+
member :category, converter: GandiV5::Data::Converter::Symbol
|
27
|
+
|
28
|
+
# List of available TLDs.
|
29
|
+
# @see https://api.gandi.net/docs/domains#get-v5-domain-tlds
|
30
|
+
# @return Array<GandiV5::Domain::TLD>
|
31
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
32
|
+
def self.list
|
33
|
+
GandiV5.get(url)
|
34
|
+
.last
|
35
|
+
.map { |tld| GandiV5::Domain::TLD.from_gandi tld }
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get TLD information.
|
39
|
+
# @see https://api.gandi.net/docs/domains#get-v5-domain-tlds-name
|
40
|
+
# @param name [String, #to_s] the top level domain to get information for.
|
41
|
+
# @return [GandiV5::Domain::TLD]
|
42
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
43
|
+
def self.fetch(name)
|
44
|
+
_response, data = GandiV5.get url(name)
|
45
|
+
GandiV5::Domain::TLD.from_gandi data
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def self.url(name = nil)
|
51
|
+
"#{BASE}domain/tlds" +
|
52
|
+
(name ? "/#{CGI.escape name}" : '')
|
53
|
+
end
|
54
|
+
private_class_method :url
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/gandi_v5/domain.rb
CHANGED
@@ -1,28 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# TODO: Add method renewal_price(currency: 'GBP', period: 1, sharing_id: self.sharing_id)
|
4
|
-
|
5
|
-
# TODO: Glue Record Management
|
6
|
-
# * get-v5-domain-domains-domain-hosts
|
7
|
-
# * post-v5-domain-domains-domain-hosts
|
8
|
-
# TODO: Glue Record Information
|
9
|
-
# * get-v5-domain-domains-domain-hosts-name
|
10
|
-
# * put-v5-domain-domains-domain-hosts-name
|
11
|
-
# * delete-v5-domain-domains-domain-hosts-name
|
12
|
-
# TODO: LiveDNS Management
|
13
|
-
# * get-v5-domain-domains-domain-livedns
|
14
|
-
# * post-v5-domain-domains-domain-livedns
|
15
|
-
# TODO: Nameservers Management
|
16
|
-
# * get-v5-domain-domains-domain-nameservers
|
17
|
-
# * put-v5-domain-domains-domain-nameservers
|
18
|
-
|
19
3
|
require_relative 'domain/auto_renew'
|
4
|
+
require_relative 'domain/availability'
|
20
5
|
require_relative 'domain/contact'
|
21
6
|
require_relative 'domain/contract'
|
22
7
|
require_relative 'domain/dates'
|
23
8
|
require_relative 'domain/renewal_information'
|
24
9
|
require_relative 'domain/restore_information'
|
25
10
|
require_relative 'domain/sharing_space'
|
11
|
+
require_relative 'domain/tld'
|
26
12
|
|
27
13
|
class GandiV5
|
28
14
|
# Gandi Domain Management API.
|
@@ -175,7 +161,7 @@ class GandiV5
|
|
175
161
|
# Contacts for the domain.
|
176
162
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-contacts
|
177
163
|
# @return [Hash{:owner, :admin, :bill, :tech => GandiV5::Domain::Contact}]
|
178
|
-
# @raise [GandiV5::Error::GandiError
|
164
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
179
165
|
def contacts
|
180
166
|
@contacts ||= fetch_contacts
|
181
167
|
end
|
@@ -183,9 +169,9 @@ class GandiV5
|
|
183
169
|
# Requery Gandi for the domain's contacts.
|
184
170
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-contacts
|
185
171
|
# @return [Hash{:owner, :admin, :bill, :tech => GandiV5::Domain::Contact}]
|
186
|
-
# @raise [GandiV5::Error::GandiError
|
172
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
187
173
|
def fetch_contacts
|
188
|
-
data = GandiV5.get url('contacts')
|
174
|
+
_response, data = GandiV5.get url('contacts')
|
189
175
|
self.contacts = data.transform_keys(&:to_sym)
|
190
176
|
CONTACTS_CONVERTER.call contacts
|
191
177
|
end
|
@@ -199,7 +185,7 @@ class GandiV5
|
|
199
185
|
# @param tech [GandiV5::Domain::Contact, #to_gandi, #to_h]
|
200
186
|
# details for the new technical contact.
|
201
187
|
# @return [Hash{:owner, :admin, :bill, :tech => GandiV5::Domain::Contact}]
|
202
|
-
# @raise [GandiV5::Error::GandiError
|
188
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
203
189
|
def update_contacts(admin: nil, bill: nil, tech: nil)
|
204
190
|
body = {
|
205
191
|
admin: admin.respond_to?(:to_gandi) ? admin.to_gandi : admin,
|
@@ -214,7 +200,7 @@ class GandiV5
|
|
214
200
|
# Renewal information for the domain.
|
215
201
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-renew
|
216
202
|
# @return [GandiV5::Domain::RenewalInformation]
|
217
|
-
# @raise [GandiV5::Error::GandiError
|
203
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
218
204
|
def renewal_information
|
219
205
|
@renewal_information ||= fetch_renewal_information
|
220
206
|
end
|
@@ -222,9 +208,9 @@ class GandiV5
|
|
222
208
|
# Requery Gandi for the domain's renewal information.
|
223
209
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-renew
|
224
210
|
# @return [GandiV5::Domain::RenewalInformation]
|
225
|
-
# @raise [GandiV5::Error::GandiError
|
211
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
226
212
|
def fetch_renewal_information
|
227
|
-
data = GandiV5.get url('renew')
|
213
|
+
_response, data = GandiV5.get url('renew')
|
228
214
|
data = data['renew'].merge('contracts' => data['contracts'])
|
229
215
|
@renewal_information = GandiV5::Domain::RenewalInformation.from_gandi data
|
230
216
|
end
|
@@ -234,31 +220,29 @@ class GandiV5
|
|
234
220
|
# @see https://api.gandi.net/docs/domains#post-v5-domain-domains-domain-renew
|
235
221
|
# @param duration [Integer, #to_s] how long to renew for (in years).
|
236
222
|
# @return [String] confirmation message from Gandi.
|
237
|
-
# @raise [GandiV5::Error::GandiError
|
223
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
238
224
|
def renew_for(duration = 1)
|
239
225
|
body = { duration: duration }.to_json
|
240
|
-
data = GandiV5.post url('renew'), body
|
226
|
+
_response, data = GandiV5.post url('renew'), body
|
241
227
|
data['message']
|
242
228
|
end
|
243
229
|
|
244
|
-
# TODO: Test when I have a restorable domain
|
245
230
|
# Restoration information for the domain.
|
246
231
|
# @see https://docs.gandi.net/en/domain_names/renew/restore.html
|
247
232
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-restore
|
248
233
|
# @return [GandiV5::Domain::RestoreInformation]
|
249
|
-
# @raise [GandiV5::Error::GandiError
|
234
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
250
235
|
def restore_information
|
251
236
|
@restore_information ||= fetch_restore_information
|
252
237
|
end
|
253
238
|
|
254
|
-
# TODO: Test when I have a restorable domain
|
255
239
|
# Requery Gandi for the domain's restore information.
|
256
240
|
# @see https://docs.gandi.net/en/domain_names/renew/restore.html
|
257
241
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain-restore
|
258
242
|
# @return [GandiV5::Domain::RestoreInformation]
|
259
|
-
# @raise [GandiV5::Error::GandiError
|
243
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
260
244
|
def fetch_restore_information
|
261
|
-
data = GandiV5.get url('restore')
|
245
|
+
_response, data = GandiV5.get url('restore')
|
262
246
|
@restore_information = GandiV5::Domain::RestoreInformation.from_gandi data
|
263
247
|
rescue RestClient::NotFound
|
264
248
|
@restore_information = GandiV5::Domain::RestoreInformation.from_gandi restorable: false
|
@@ -269,21 +253,33 @@ class GandiV5
|
|
269
253
|
# @see https://docs.gandi.net/en/domain_names/renew/restore.html
|
270
254
|
# @see https://api.gandi.net/docs/domains#post-v5-domain-domains-domain-restore
|
271
255
|
# @return [String] The confirmation message from Gandi.
|
272
|
-
# @raise [GandiV5::Error::GandiError
|
256
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
273
257
|
def restore
|
274
|
-
data = GandiV5.post url('restore'), '{}'
|
258
|
+
_response, data = GandiV5.post url('restore'), '{}'
|
275
259
|
data['message']
|
276
260
|
end
|
277
261
|
|
278
262
|
# Requery Gandi fo this domain's information.
|
279
263
|
# @return [GandiV5::Domain]
|
280
|
-
# @raise [GandiV5::Error::GandiError
|
264
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
281
265
|
def refresh
|
282
|
-
data = GandiV5.get url
|
266
|
+
_response, data = GandiV5.get url
|
283
267
|
from_gandi data
|
284
268
|
auto_renew.domain = self
|
285
269
|
end
|
286
270
|
|
271
|
+
# Get the price for renewing this domain.
|
272
|
+
# @param currency [String] the currency to get the price in (e.g. GBP)
|
273
|
+
# @param period [Integer] the number of year(s) renewal to get the price for
|
274
|
+
# @return [GandiV5::Domain::Availability::Product::Price]
|
275
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error
|
276
|
+
def renewal_price(currency: 'GBP', period: 1)
|
277
|
+
arguments = { processes: [:renew], currency: currency, period: period }
|
278
|
+
GandiV5::Domain::Availability.fetch(fqdn, **arguments)
|
279
|
+
.products.first
|
280
|
+
.prices.first
|
281
|
+
end
|
282
|
+
|
287
283
|
# Create (register) a new domain.
|
288
284
|
# Warning! This is not a free operation. Please ensure your prepaid account has enough credit.
|
289
285
|
# @see https://api.gandi.net/docs/domains#post-v5-domain-domains
|
@@ -319,27 +315,28 @@ class GandiV5
|
|
319
315
|
# "eap7", "eap8", "eap9", "golive", #to_gandi, #to_json] (optional)
|
320
316
|
# @see https://docs.gandi.net/en/domain_names/register/new_gtld.html
|
321
317
|
# @param dry_run [Boolean] whether the details should be checked
|
322
|
-
# instead of actually creating the domain
|
323
|
-
# @return [
|
324
|
-
# @return [Hash] if doing a dry run, you get what Gandi returns
|
325
|
-
# @raise [GandiV5::Error::GandiError
|
326
|
-
# TODO: Return created domain unless dry_run
|
318
|
+
# instead of actually creating the domain
|
319
|
+
# @return [GandiV5::Domain] the created domain
|
320
|
+
# @return [Hash] if doing a dry run, you get what Gandi returns
|
321
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error
|
327
322
|
def self.create(fqdn, dry_run: false, **params)
|
328
323
|
fail ArgumentError, 'missing keyword: owner' unless params.key?(:owner)
|
329
324
|
|
330
325
|
body = params.merge(fqdn: fqdn)
|
331
326
|
.transform_values { |val| val.respond_to?(:to_gandi) ? val.to_gandi : val }
|
332
327
|
.to_json
|
333
|
-
|
328
|
+
|
329
|
+
response, data = GandiV5.post(url, body, 'Dry-Run': dry_run ? 1 : 0)
|
330
|
+
dry_run ? data : fetch(response.headers[:location].split('/').last)
|
334
331
|
end
|
335
332
|
|
336
333
|
# Get information on a domain.
|
337
334
|
# @see https://api.gandi.net/docs/domains#get-v5-domain-domains-domain
|
338
335
|
# @param fqdn [String, #to_s] the fully qualified domain name to fetch.
|
339
336
|
# @return [GandiV5::Domain]
|
340
|
-
# @raise [GandiV5::Error::GandiError
|
337
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
341
338
|
def self.fetch(fqdn)
|
342
|
-
data = GandiV5.get url(fqdn)
|
339
|
+
_response, data = GandiV5.get url(fqdn)
|
343
340
|
domain = from_gandi data
|
344
341
|
domain.auto_renew.domain = fqdn
|
345
342
|
domain
|
@@ -357,13 +354,13 @@ class GandiV5
|
|
357
354
|
# @param sort_by [String, #to_s] (optional default "fqdn") how to sort the list.
|
358
355
|
# @param tld [String, #to_s] (optional) used to filter by just the top level domain.
|
359
356
|
# @return [Array<GandiV5::Domain>]
|
360
|
-
# @raise [GandiV5::Error::GandiError
|
357
|
+
# @raise [GandiV5::Error::GandiError] if Gandi returns an error.
|
361
358
|
def self.list(page: (1..), per_page: 100, **params)
|
362
359
|
page = [page.to_i] unless page.respond_to?(:each)
|
363
360
|
|
364
361
|
domains = []
|
365
362
|
page.each do |page_number|
|
366
|
-
data = GandiV5.get url, params: params.merge(page: page_number, per_page: per_page)
|
363
|
+
_resp, data = GandiV5.get url, params: params.merge(page: page_number, per_page: per_page)
|
367
364
|
break if data.empty?
|
368
365
|
|
369
366
|
domains += data.map { |domain| from_gandi domain }
|
@@ -372,48 +369,6 @@ class GandiV5
|
|
372
369
|
domains
|
373
370
|
end
|
374
371
|
|
375
|
-
# Check domain availability and pricing.
|
376
|
-
# @see https://api.gandi.net/docs/domains#get-v5-domain-check
|
377
|
-
# @param fqdn [String, #to_s] the fully qualified domain name to check.
|
378
|
-
# @param country [String, #to_s] (optional) ISO country code for which taxes are to be applied.
|
379
|
-
# @param currency [String, #to_s] (optional) request price for a specific ISO currency code.
|
380
|
-
# @param duration_unit [String, #to_s] (optional) define the unit for max_duration.
|
381
|
-
# @param extension [String, #to_s] (optional) query a specific extension for product options.
|
382
|
-
# @param grid [String, #to_s] (optional) request price for a specific rate.
|
383
|
-
# @param lang [String, #to_s] (optional) language code.
|
384
|
-
# @param max_duration [Integer, #to_s] (optional)
|
385
|
-
# set a limit on the duration range for returned prices.
|
386
|
-
# @param period [String, #to_s] (optional) specific registration period to query.
|
387
|
-
# @param _ [Array<:create, :renew, :transfer etc.>] (optional default [:create])
|
388
|
-
# list of at least 1 process for which pricing is to be made.
|
389
|
-
# @param sharing_id [String, #to_s] (optional) organization for which the pricing is to be made.
|
390
|
-
# @return [Hash]
|
391
|
-
# TODO: Return an Availabillity object ???
|
392
|
-
# @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
|
393
|
-
def self.availability(fqdn, **options)
|
394
|
-
GandiV5.get "#{BASE}domain/check", params: { name: fqdn }.merge(options)
|
395
|
-
end
|
396
|
-
|
397
|
-
# List of available TLDs.
|
398
|
-
# @see https://api.gandi.net/docs/domains#get-v5-domain-tlds
|
399
|
-
# @return Array<String>
|
400
|
-
# TODO: Maybe return an array of TLD objects ???
|
401
|
-
# @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
|
402
|
-
def self.tlds
|
403
|
-
GandiV5.get("#{BASE}domain/tlds")
|
404
|
-
.map { |hash| hash['name'] }
|
405
|
-
end
|
406
|
-
|
407
|
-
# Get TLD information.
|
408
|
-
# @see https://api.gandi.net/docs/domains#get-v5-domain-tlds-name
|
409
|
-
# @param name [String, #to_s] the top level domain to get information for.
|
410
|
-
# @return [Hash]
|
411
|
-
# TODO: Return a TLD object ???
|
412
|
-
# @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
|
413
|
-
def self.tld(name)
|
414
|
-
GandiV5.get("#{BASE}domain/tlds/#{CGI.escape name}").transform_keys(&:to_sym)
|
415
|
-
end
|
416
|
-
|
417
372
|
private
|
418
373
|
|
419
374
|
def url(extra = nil)
|