gandi_v5 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +20 -0
  5. data/.travis.yml +23 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +40 -0
  9. data/LICENSE.md +32 -0
  10. data/README.md +94 -0
  11. data/Rakefile +3 -0
  12. data/TODO.md +29 -0
  13. data/bin/console +13 -0
  14. data/gandi_v5.gemspec +41 -0
  15. data/lib/gandi_v5/billing/info/prepaid.rb +33 -0
  16. data/lib/gandi_v5/billing/info.rb +26 -0
  17. data/lib/gandi_v5/billing.rb +28 -0
  18. data/lib/gandi_v5/data/converter/array_of.rb +35 -0
  19. data/lib/gandi_v5/data/converter/symbol.rb +26 -0
  20. data/lib/gandi_v5/data/converter/time.rb +28 -0
  21. data/lib/gandi_v5/data/converter.rb +41 -0
  22. data/lib/gandi_v5/data.rb +244 -0
  23. data/lib/gandi_v5/domain/auto_renew.rb +64 -0
  24. data/lib/gandi_v5/domain/contact.rb +102 -0
  25. data/lib/gandi_v5/domain/contract.rb +22 -0
  26. data/lib/gandi_v5/domain/dates.rb +44 -0
  27. data/lib/gandi_v5/domain/renewal_information.rb +41 -0
  28. data/lib/gandi_v5/domain/restore_information.rb +18 -0
  29. data/lib/gandi_v5/domain/sharing_space.rb +21 -0
  30. data/lib/gandi_v5/domain.rb +431 -0
  31. data/lib/gandi_v5/email/mailbox/responder.rb +36 -0
  32. data/lib/gandi_v5/email/mailbox.rb +236 -0
  33. data/lib/gandi_v5/email/offer.rb +27 -0
  34. data/lib/gandi_v5/email/slot.rb +134 -0
  35. data/lib/gandi_v5/email.rb +11 -0
  36. data/lib/gandi_v5/error/gandi_error.rb +21 -0
  37. data/lib/gandi_v5/error.rb +9 -0
  38. data/lib/gandi_v5/live_dns/domain.rb +211 -0
  39. data/lib/gandi_v5/live_dns/record_set.rb +79 -0
  40. data/lib/gandi_v5/live_dns/zone/snapshot.rb +62 -0
  41. data/lib/gandi_v5/live_dns/zone.rb +301 -0
  42. data/lib/gandi_v5/live_dns.rb +30 -0
  43. data/lib/gandi_v5/organization.rb +66 -0
  44. data/lib/gandi_v5/version.rb +5 -0
  45. data/lib/gandi_v5.rb +178 -0
  46. data/spec/.rubocop.yml +4 -0
  47. data/spec/features/domain_spec.rb +45 -0
  48. data/spec/features/livedns_domain_spec.rb +8 -0
  49. data/spec/features/livedns_zone_spec.rb +45 -0
  50. data/spec/features/mailbox_spec.rb +18 -0
  51. data/spec/fixtures/bodies/GandiV5_Billing/info.yaml +10 -0
  52. data/spec/fixtures/bodies/GandiV5_Domain/availability.yaml +15 -0
  53. data/spec/fixtures/bodies/GandiV5_Domain/fetch_contacts.yaml +8 -0
  54. data/spec/fixtures/bodies/GandiV5_Domain/get.yaml +37 -0
  55. data/spec/fixtures/bodies/GandiV5_Domain/list.yaml +20 -0
  56. data/spec/fixtures/bodies/GandiV5_Domain/renewal_info.yaml +12 -0
  57. data/spec/fixtures/bodies/GandiV5_Domain/restore_info.yaml +5 -0
  58. data/spec/fixtures/bodies/GandiV5_Domain/tld.yaml +10 -0
  59. data/spec/fixtures/bodies/GandiV5_Domain/tlds.yaml +7 -0
  60. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/get.yaml +16 -0
  61. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/list.yaml +8 -0
  62. data/spec/fixtures/bodies/GandiV5_Email_Slot/get.yaml +10 -0
  63. data/spec/fixtures/bodies/GandiV5_Email_Slot/list.yaml +8 -0
  64. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/get.yaml +4 -0
  65. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/list.yaml +2 -0
  66. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/get.yaml +11 -0
  67. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/list.yaml +11 -0
  68. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/get.yaml +9 -0
  69. data/spec/fixtures/bodies/GandiV5_Organization/get.yaml +17 -0
  70. data/spec/fixtures/vcr/Domain_features/List_domains.yml +54 -0
  71. data/spec/fixtures/vcr/Domain_features/Renew_domain.yml +133 -0
  72. data/spec/fixtures/vcr/LiveDNS_Domain_features/List_domains.yml +32 -0
  73. data/spec/fixtures/vcr/LiveDNS_Zone_features/List_zones.yml +42 -0
  74. data/spec/fixtures/vcr/LiveDNS_Zone_features/Make_and_save_snapshot.yml +72 -0
  75. data/spec/fixtures/vcr/LiveDNS_Zone_features/Save_zone_to_file.yml +28 -0
  76. data/spec/fixtures/vcr/Mailbox_features/List_mailboxes.yml +39 -0
  77. data/spec/spec_helper.rb +60 -0
  78. data/spec/test.env +1 -0
  79. data/spec/units/gandi_v5/billing/info/prepaid_spec.rb +20 -0
  80. data/spec/units/gandi_v5/billing/info_spec.rb +4 -0
  81. data/spec/units/gandi_v5/billing_spec.rb +41 -0
  82. data/spec/units/gandi_v5/data/converter/array_of_spec.rb +18 -0
  83. data/spec/units/gandi_v5/data/converter/symbol_spec.rb +16 -0
  84. data/spec/units/gandi_v5/data/converter/time_spec.rb +16 -0
  85. data/spec/units/gandi_v5/data/converter_spec.rb +31 -0
  86. data/spec/units/gandi_v5/data_spec.rb +340 -0
  87. data/spec/units/gandi_v5/domain/auto_renew_spec.rb +70 -0
  88. data/spec/units/gandi_v5/domain/contact_spec.rb +36 -0
  89. data/spec/units/gandi_v5/domain/contract_spec.rb +4 -0
  90. data/spec/units/gandi_v5/domain/dates_spec.rb +4 -0
  91. data/spec/units/gandi_v5/domain/renewal_information_spec.rb +81 -0
  92. data/spec/units/gandi_v5/domain/restore_information_spec.rb +4 -0
  93. data/spec/units/gandi_v5/domain/sharing_space_spec.rb +4 -0
  94. data/spec/units/gandi_v5/domain_spec.rb +451 -0
  95. data/spec/units/gandi_v5/email/mailbox/responder_spec.rb +131 -0
  96. data/spec/units/gandi_v5/email/mailbox_spec.rb +384 -0
  97. data/spec/units/gandi_v5/email/offer_spec.rb +17 -0
  98. data/spec/units/gandi_v5/email/slot_spec.rb +102 -0
  99. data/spec/units/gandi_v5/error/gandi_error_spec.rb +30 -0
  100. data/spec/units/gandi_v5/error_spec.rb +4 -0
  101. data/spec/units/gandi_v5/live_dns/domain_spec.rb +247 -0
  102. data/spec/units/gandi_v5/live_dns/record_set_spec.rb +74 -0
  103. data/spec/units/gandi_v5/live_dns/zone/snapshot_spec.rb +37 -0
  104. data/spec/units/gandi_v5/live_dns/zone_spec.rb +329 -0
  105. data/spec/units/gandi_v5/live_dns_spec.rb +17 -0
  106. data/spec/units/gandi_v5/organization_spec.rb +30 -0
  107. data/spec/units/gandi_v5_spec.rb +204 -0
  108. metadata +406 -0
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'data/converter'
4
+
5
+ class GandiV5
6
+ # Addin providing a DSL to manage declaring attributes and how to map
7
+ # and convert to/from Gandi's fields.
8
+ module Data
9
+ # api private
10
+ # Add contents of ClassMethods to the Class which includes this module.
11
+ # @param host_class [Class] the class which included us.
12
+ def self.included(host_class)
13
+ host_class.extend ClassMethods
14
+
15
+ host_class.instance_exec do
16
+ @data_members ||= Set.new
17
+ @data_converters ||= {}
18
+ @data_map_key_to_member ||= {}
19
+ @data_map_member_to_key ||= {}
20
+ end
21
+ end
22
+
23
+ # Get a hash representation of the object.
24
+ # @return [Hash<Symbol => Object>]
25
+ def to_h
26
+ Hash[
27
+ data_members.map do |key|
28
+ value = send(key)
29
+ next [key, value] if value.nil?
30
+
31
+ if value.is_a?(Enumerable)
32
+ value = to_h_transform_enumerable(value)
33
+ elsif value.respond_to?(:to_h)
34
+ value = value.to_h
35
+ end
36
+ [key, value]
37
+ end
38
+ ]
39
+ end
40
+
41
+ # Get a hash representation of this object suitable for passing back to Gandi.
42
+ # @return [Hash<String => nil, Boolean, String, Numeric, Hash, Array>]
43
+ def to_gandi
44
+ data = {}
45
+
46
+ data_members.each do |member|
47
+ key = data_member_to_gandi_key(member)
48
+ value = send(member)
49
+ converter = data_converter_for(member)
50
+
51
+ data[key] = if value.respond_to?(:to_gandi)
52
+ value.to_gandi
53
+ elsif converter && !value.nil?
54
+ converter.to_gandi(value)
55
+ else
56
+ value
57
+ end
58
+ end
59
+
60
+ data
61
+ end
62
+
63
+ # Get an array of values from particular members.
64
+ # @param keys [Array<Symbol, String>] e.g. :fqdn, "contacts.owner"
65
+ # @return [Array<Object>]
66
+ # rubocop:disable Style/IfUnlessModifier
67
+ def values_at(*keys)
68
+ keys.map(&:to_s).map do |key|
69
+ key, sub_key = key.split('.', 2)
70
+ unless data_member?(key.to_sym)
71
+ fail ArgumentError, "#{key} is not a member."
72
+ end
73
+
74
+ sub_key.empty? ? send(key) : send(key).values_at(sub_key)
75
+ end
76
+ end
77
+ # rubocop:enable Style/IfUnlessModifier
78
+
79
+ # Update instance with data from Gandi.
80
+ # @param data [Hash]
81
+ # @return [self]
82
+ def from_gandi(data)
83
+ translate_gandi(data).each do |key, value|
84
+ next unless data_member?(key.to_sym)
85
+
86
+ send "#{key}=", value
87
+ end
88
+ self
89
+ end
90
+
91
+ # Create a new instance from any passed members.
92
+ # @param members [Hash<Symbol => Object>]
93
+ # rubocop:disable Style/IfUnlessModifier
94
+ def initialize(**members)
95
+ members.each do |member, value|
96
+ unless data_member?(member)
97
+ fail ArgumentError, "unknown keyword: #{member}"
98
+ end
99
+
100
+ send "#{member}=", value
101
+ end
102
+ end
103
+ # rubocop:enable Style/IfUnlessModifier
104
+
105
+ private
106
+
107
+ def data_members
108
+ self.class.send(:data_members)
109
+ end
110
+
111
+ def data_member?(member)
112
+ self.class.send(:data_member?, member)
113
+ end
114
+
115
+ def data_gandi_key_to_member(gandi_key)
116
+ self.class.send(:data_gandi_key_to_member, gandi_key)
117
+ end
118
+
119
+ def data_member_to_gandi_key(member)
120
+ self.class.send(:data_member_to_gandi_key, member)
121
+ end
122
+
123
+ def data_converter_for(member)
124
+ self.class.send(:data_converter_for, member)
125
+ end
126
+
127
+ def data_converter_for?(member)
128
+ self.class.send(:data_converter_for?, member)
129
+ end
130
+
131
+ def translate_gandi(data)
132
+ self.class.send(:translate_gandi, data)
133
+ end
134
+
135
+ def to_h_transform_enumerable(value)
136
+ method = :transform_keys if value.respond_to?(:transform_keys)
137
+ method ||= :map if value.respond_to?(:map)
138
+
139
+ value.send(method) do |v|
140
+ next to_h_transform_value(v) if v.is_a?(Enumerable)
141
+
142
+ v.respond_to?(:to_h) ? v.to_h : v
143
+ end
144
+ end
145
+
146
+ # Class methods to add to classes which include this module.
147
+ module ClassMethods
148
+ # Create a new instance with data from Gandi.
149
+ # @param data [Hash]
150
+ def from_gandi(data)
151
+ return nil if data.nil?
152
+
153
+ new(
154
+ translate_gandi(data).transform_keys(&:to_sym)
155
+ .select { |k, _v| data_member?(k) }
156
+ )
157
+ end
158
+
159
+ private
160
+
161
+ def members(*names)
162
+ names.each do |name|
163
+ member name
164
+ end
165
+ end
166
+
167
+ def member(name, gandi_key: name.to_s, converter: nil, array: false)
168
+ @data_members.add name
169
+ @data_map_key_to_member[gandi_key] = name
170
+ @data_map_member_to_key[name] = gandi_key
171
+ convert_member_with(name, gandi_key, converter, array) if converter
172
+
173
+ define_method name do
174
+ instance_variable_get "@#{name}"
175
+ end
176
+
177
+ define_method "#{name}?" do
178
+ !instance_variable_get("@#{name}").nil?
179
+ end
180
+
181
+ define_method "#{name}=" do |value|
182
+ instance_variable_set("@#{name}", value)
183
+ end
184
+ private "#{name}="
185
+ end
186
+
187
+ # @api private
188
+ def data_members
189
+ instance_variable_get(:@data_members).to_a
190
+ end
191
+
192
+ # @api private
193
+ def data_member?(member)
194
+ instance_variable_get(:@data_members).include?(member)
195
+ end
196
+
197
+ # @api private
198
+ def data_gandi_key_to_member(gandi_key)
199
+ instance_variable_get(:@data_map_key_to_member).fetch(gandi_key)
200
+ end
201
+
202
+ # @api private
203
+ def data_member_to_gandi_key(member)
204
+ instance_variable_get(:@data_map_member_to_key).fetch(member)
205
+ end
206
+
207
+ # @api private
208
+ def data_converter_for(member)
209
+ instance_variable_get(:@data_converters)[member]
210
+ end
211
+
212
+ # @api private
213
+ def data_converter_for?(member)
214
+ instance_variable_get(:@data_converters).key?(member)
215
+ end
216
+
217
+ # @api private
218
+ def convert_member_with(name, gandi_key, converter, array)
219
+ converter = GandiV5::Data::Converter::ArrayOf.new(converter) if array
220
+ @data_converters[name] = converter
221
+ @data_converters[gandi_key] = converter
222
+ end
223
+
224
+ def translate_gandi(data)
225
+ return nil unless data.is_a?(Hash)
226
+
227
+ data = data.clone
228
+
229
+ # Do name mapping
230
+ @data_map_key_to_member.each do |key, member|
231
+ data[member] = data.delete(key) if data.key?(key)
232
+ end
233
+
234
+ # Do value conversions
235
+ data.each do |key, value|
236
+ converter = data_converter_for(key)
237
+ data[key] = converter.from_gandi(value) if converter
238
+ end
239
+
240
+ data
241
+ end
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Automatic renewal information for a domain.
6
+ # @!attribute [r] dates
7
+ # @return [nil, Array<Time>]
8
+ # @!attribute [r] duration
9
+ # @return [nil, Integer]
10
+ # @!attribute [r] enabled
11
+ # @return [nil, Boolean]
12
+ # @!attribute [r] org_id
13
+ # @return [nil, String]
14
+ class AutoRenew
15
+ include GandiV5::Data
16
+
17
+ attr_accessor :domain
18
+
19
+ members :duration, :enabled, :org_id
20
+ member :dates, converter: GandiV5::Data::Converter::Time, array: true
21
+
22
+ # Disable auto renewal for the associated domain.
23
+ # @return [String] The confirmation message from Gandi.
24
+ # @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
25
+ def disable
26
+ body = { enabled: false }.to_json
27
+ data = GandiV5.patch url, body
28
+ self.enabled = false
29
+ data['message']
30
+ end
31
+
32
+ # Disable auto renewal for the associated domain.
33
+ # @param duration [Integer, #to_s] how long to renew for.
34
+ # @param org_id [String, #to_s] UUID of the organisation that should pay.
35
+ # @return [String] The confirmation message from Gandi.
36
+ # @raise [ArgumentError] if duration is invalid (not 1 to 9 (inclusive)).
37
+ # @raise [ArgumentError] if org_id is not passed and not set for this domain.
38
+ # @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
39
+ def enable(duration: self.duration || 1, org_id: self.org_id)
40
+ fail ArgumentError, 'duration can not be less than 1' if duration < 1
41
+ fail ArgumentError, 'duration can not be more than 9' if duration > 9
42
+ fail ArgumentError, 'org_id is required' if org_id.nil?
43
+
44
+ body = {
45
+ enabled: true,
46
+ duration: duration,
47
+ org_id: org_id
48
+ }.to_json
49
+
50
+ data = GandiV5.patch url, body
51
+ self.enabled = true
52
+ self.duration = duration
53
+ self.org_id = org_id
54
+ data['message']
55
+ end
56
+
57
+ private
58
+
59
+ def url
60
+ "#{BASE}domain/domains/#{CGI.escape domain.fqdn}/autorenew"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Information for a single contact for a domain.
6
+ # @!attribute [r] country
7
+ # @return [String] .
8
+ # @!attribute [r] email
9
+ # @return [String] .
10
+ # @!attribute [r] family
11
+ # @return [String] .
12
+ # @!attribute [r] given
13
+ # @return [String] .
14
+ # @!attribute [r] address
15
+ # @return [String] .
16
+ # @!attribute [r] type
17
+ # @return [:person, :company, :association, :'public body', :reseller]
18
+ # @!attribute [r] brand_number
19
+ # @return [nil, String]
20
+ # @!attribute [r] city
21
+ # @return [nil, String]
22
+ # @!attribute [r] data_obfuscated
23
+ # @return [nil, Boolean]
24
+ # @!attribute [r] extra_parameters
25
+ # @return [nil, Hash]
26
+ # @!attribute [r] fax
27
+ # @return [nil, String]
28
+ # @!attribute [r] jo_announce_number
29
+ # @return [nil, String]
30
+ # @!attribute [r] jo_announce_page
31
+ # @return [nil, String]
32
+ # @!attribute [r] jo_declaration_page
33
+ # @return [nil, String]
34
+ # @!attribute [r] jo_publication_date
35
+ # @return [nil, String]
36
+ # @!attribute [r] mail_obfuscated
37
+ # @return [nil, Boolean]
38
+ # @!attribute [r] mobile
39
+ # @return [nil, String]
40
+ # @!attribute [r] organisation_name
41
+ # @return [nil, String] the legal name of the company, association, or public body
42
+ # if the contact type is not :person.
43
+ # @!attribute [r] phone
44
+ # @return [nil, String]
45
+ # @!attribute [r] reachability
46
+ # @return [nil, :pending, :done, :failed, :deleted, :none]
47
+ # @!attribute [r] sharing_uuid
48
+ # @return [nil, String]
49
+ # @!attribute [r] siren
50
+ # @return [nil, String]
51
+ # @!attribute [r] state
52
+ # @return [nil, String]
53
+ # @see https://docs.gandi.net/en/rest_api/domain_api/contacts_api.html
54
+ # @!attribute [r] validation
55
+ # @return [nil, :pending, :done, :failed, :deleted, :none]
56
+ # @!attribute [r] zip
57
+ # @return [nil, String]
58
+ class Contact
59
+ include GandiV5::Data
60
+
61
+ TYPES = {
62
+ person: 'Person',
63
+ company: 'Company',
64
+ association: 'Association',
65
+ 'public body': 'Public Body',
66
+ reseller: 'Reseller'
67
+ }.freeze
68
+ REACHABILITIES = %i[pending done failed deleted none].freeze
69
+ VALIDATIONS = %i[pending done failed deleted none].freeze
70
+
71
+ members :country, :email, :family, :given, :brand_number, :city, :data_obfuscated,
72
+ :extra_parameters, :fax, :jo_announce_number, :jo_announce_page,
73
+ :jo_declaration_page, :jo_publication_date, :mail_obfuscated,
74
+ :mobile, :phone, :siren, :state, :zip
75
+
76
+ member :organisation_name, gandi_key: 'orgname'
77
+ member :address, gandi_key: 'streetaddr'
78
+ member :sharing_uuid, gandi_key: 'sharing_id'
79
+
80
+ member(
81
+ :type,
82
+ converter: GandiV5::Data::Converter.new(
83
+ from_gandi: ->(type) { TYPES.keys[type] },
84
+ to_gandi: ->(type) { TYPES.keys.index(type) }
85
+ )
86
+ )
87
+ member :reachability, converter: GandiV5::Data::Converter::Symbol
88
+ member :validation, converter: GandiV5::Data::Converter::Symbol
89
+
90
+ # Get the name for this contact.
91
+ # @return [String] e.g. "John Smith" or "Some Company LTD."
92
+ def name
93
+ type.eql?(:person) ? "#{given} #{family}" : organisation_name
94
+ end
95
+
96
+ # @return [String] Containing type and name.
97
+ def to_s
98
+ "#{TYPES[type]}\t#{name}"
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # A contract relevant to renewing/restoring a domain.
6
+ # @!attribute [r] id
7
+ # @return [String]
8
+ # @!attribute [r] name
9
+ # @return [String]
10
+ # @!attribute [r] href
11
+ # @return [nil, String]
12
+ # @!attribute [r] registry_contract_href
13
+ # @return [nil, String]
14
+ class Contract
15
+ include GandiV5::Data
16
+
17
+ members :id, :name, :href, :registry_contract_href
18
+
19
+ alias contract_id id
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Dates of key events for a domain.
6
+ # @!attribute [r] registry_created_at
7
+ # @return [Time]
8
+ # @!attribute [r] updated_at
9
+ # @return [Time]
10
+ # @!attribute [r] authinfo_expires_at
11
+ # @return [nil, Time]
12
+ # @!attribute [r] created_at
13
+ # @return [nil, Time]
14
+ # @!attribute [r] deletes_at
15
+ # @return [nil, Time]
16
+ # @!attribute [r] hold_begins_at
17
+ # @return [nil, Time]
18
+ # @!attribute [r] hold_ends_at
19
+ # @return [nil, Time]
20
+ # @!attribute [r] pending_delete_ends_at
21
+ # @return [nil, Time]
22
+ # @!attribute [r] registry_ends_at
23
+ # @return [nil, Time]
24
+ # @!attribute [r] renew_begins_at
25
+ # @return [nil, Time]
26
+ # @!attribute [r] restore_ends_at
27
+ # @return [nil, Time]
28
+ class Dates
29
+ include GandiV5::Data
30
+
31
+ member :registry_created_at, converter: GandiV5::Data::Converter::Time
32
+ member :updated_at, converter: GandiV5::Data::Converter::Time
33
+ member :authinfo_expires_at, converter: GandiV5::Data::Converter::Time
34
+ member :created_at, converter: GandiV5::Data::Converter::Time
35
+ member :deletes_at, converter: GandiV5::Data::Converter::Time
36
+ member :hold_begins_at, converter: GandiV5::Data::Converter::Time
37
+ member :hold_ends_at, converter: GandiV5::Data::Converter::Time
38
+ member :pending_delete_ends_at, converter: GandiV5::Data::Converter::Time
39
+ member :registry_ends_at, converter: GandiV5::Data::Converter::Time
40
+ member :renew_begins_at, converter: GandiV5::Data::Converter::Time
41
+ member :restore_ends_at, converter: GandiV5::Data::Converter::Time
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Renewal information for a domain.
6
+ # @!attribute [r] begins_at
7
+ # @return [Time]
8
+ # @!attribute [r] ends_at
9
+ # @return [nil, Time]
10
+ # @!attribute [r] in_renew_period
11
+ # @return [nil, Boolean]
12
+ # @!attribute [r] prohibited
13
+ # @return [Boolean]
14
+ # @!attribute [r] durations
15
+ # @return [Array<Integer>]
16
+ # @!attribute [r] maximum
17
+ # @return [Integer]
18
+ # @!attribute [r] minimum
19
+ # @return [Integer]
20
+ # @!attribute [r] contracts
21
+ # @return [Array<GandiV5::Domain::Contract>]
22
+ class RenewalInformation
23
+ include GandiV5::Data
24
+
25
+ members :in_renew_period, :prohibited, :durations, :maximum, :minimum
26
+
27
+ member :begins_at, converter: GandiV5::Data::Converter::Time
28
+ member :ends_at, converter: GandiV5::Data::Converter::Time
29
+ member :contracts, converter: GandiV5::Domain::Contract, array: true
30
+
31
+ # Check if the domain is currently renewable.
32
+ # @return [Boolean]
33
+ def renewable?
34
+ return false if prohibited
35
+ return false if begins_at > Time.now
36
+
37
+ ends_at.nil? || ends_at >= Time.now
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Restoration information for a domain.
6
+ # @see https://docs.gandi.net/en/domain_names/renew/restore.html
7
+ # @!attribute [r] restorable
8
+ # @return [Boolean]
9
+ # @!attribute [r] contracts
10
+ # @return [nil, Array<GandiV5::Domain::Contract>]
11
+ class RestoreInformation
12
+ include GandiV5::Data
13
+
14
+ members :restorable, :contracts
15
+ member :contracts, converter: GandiV5::Domain::Contract, array: true
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Domain
5
+ # Sharing space which contains a domain.
6
+ # @!attribute [r] uuid
7
+ # @return [String]
8
+ # @!attribute [r] name
9
+ # @return [String]
10
+ # @!attribute [r] reseller
11
+ # @return [nil, Boolean]
12
+ class SharingSpace
13
+ include GandiV5::Data
14
+
15
+ members :name, :reseller
16
+ member :uuid, gandi_key: 'id'
17
+
18
+ alias sharing_space_uuid uuid
19
+ end
20
+ end
21
+ end