gandi_v5 0.2.0 → 0.7.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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +13 -3
  4. data/.travis.yml +15 -1
  5. data/CHANGELOG.md +63 -0
  6. data/FUNDING.yml +10 -0
  7. data/LICENSE.md +2 -6
  8. data/README.md +16 -21
  9. data/gandi_v5.gemspec +3 -2
  10. data/lib/gandi_v5.rb +64 -24
  11. data/lib/gandi_v5/billing.rb +0 -2
  12. data/lib/gandi_v5/billing/info.rb +0 -2
  13. data/lib/gandi_v5/data.rb +1 -4
  14. data/lib/gandi_v5/data/converter.rb +0 -4
  15. data/lib/gandi_v5/data/converter/integer.rb +26 -0
  16. data/lib/gandi_v5/domain.rb +167 -28
  17. data/lib/gandi_v5/domain/availability.rb +0 -3
  18. data/lib/gandi_v5/domain/availability/product.rb +0 -3
  19. data/lib/gandi_v5/domain/live_dns.rb +42 -0
  20. data/lib/gandi_v5/domain/renewal_information.rb +0 -3
  21. data/lib/gandi_v5/domain/sharing_space.rb +10 -2
  22. data/lib/gandi_v5/email.rb +0 -4
  23. data/lib/gandi_v5/email/forward.rb +102 -0
  24. data/lib/gandi_v5/email/mailbox.rb +57 -13
  25. data/lib/gandi_v5/email/slot.rb +11 -3
  26. data/lib/gandi_v5/error.rb +0 -2
  27. data/lib/gandi_v5/live_dns.rb +0 -16
  28. data/lib/gandi_v5/live_dns/domain.rb +221 -80
  29. data/lib/gandi_v5/live_dns/domain/dnssec_key.rb +115 -0
  30. data/lib/gandi_v5/live_dns/domain/record.rb +81 -0
  31. data/lib/gandi_v5/live_dns/domain/snapshot.rb +107 -0
  32. data/lib/gandi_v5/live_dns/domain/tsig_key.rb +71 -0
  33. data/lib/gandi_v5/organization.rb +38 -5
  34. data/lib/gandi_v5/organization/customer.rb +90 -0
  35. data/lib/gandi_v5/version.rb +1 -1
  36. data/spec/.rubocop.yml +9 -2
  37. data/spec/fixtures/bodies/GandiV5_Billing/{info.yaml → info.yml} +0 -0
  38. data/spec/fixtures/bodies/GandiV5_Domain/{get.yaml → fetch.yml} +8 -0
  39. data/spec/fixtures/bodies/GandiV5_Domain/{fetch_contacts.yaml → fetch_contacts.yml} +0 -0
  40. data/spec/fixtures/bodies/GandiV5_Domain/fetch_glue_records.yml +7 -0
  41. data/spec/fixtures/bodies/GandiV5_Domain/fetch_livedns.yml +6 -0
  42. data/spec/fixtures/bodies/GandiV5_Domain/fetch_name_servers.yml +2 -0
  43. data/spec/fixtures/bodies/GandiV5_Domain/{renewal_info.yaml → fetch_renewal_info.yml} +0 -3
  44. data/spec/fixtures/bodies/GandiV5_Domain/{restore_info.yaml → fetch_restore_info.yml} +0 -0
  45. data/spec/fixtures/bodies/GandiV5_Domain/{list.yaml → list.yml} +1 -0
  46. data/spec/fixtures/bodies/GandiV5_Domain_Availability/{fetch.yaml → fetch.yml} +0 -0
  47. data/spec/fixtures/bodies/GandiV5_Domain_TLD/{fetch.yaml → fetch.yml} +0 -0
  48. data/spec/fixtures/bodies/GandiV5_Domain_TLD/{list.yaml → list.yml} +0 -0
  49. data/spec/fixtures/bodies/GandiV5_Email_Forward/list.yml +6 -0
  50. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/{get.yaml → fetch.yml} +0 -0
  51. data/spec/fixtures/bodies/GandiV5_Email_Mailbox/{list.yaml → list.yml} +0 -0
  52. data/spec/fixtures/bodies/GandiV5_Email_Slot/{get.yaml → fetch.yml} +0 -0
  53. data/spec/fixtures/bodies/GandiV5_Email_Slot/{list.yaml → list.yml} +0 -0
  54. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/fetch.yml +3 -0
  55. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/{list.yaml → list.yml} +0 -0
  56. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/list_tsig.yml +3 -0
  57. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/nameservers.yml +3 -0
  58. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_DnssecKey/fetch.yml +12 -0
  59. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_DnssecKey/list.yml +9 -0
  60. data/spec/fixtures/bodies/{GandiV5_LiveDNS_Zone_Snapshot/fetch.yaml → GandiV5_LiveDNS_Domain_Snapshot/fetch.yml} +4 -3
  61. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_Snapshot/list.yml +5 -0
  62. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_TsigKey/fetch.yml +9 -0
  63. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain_TsigKey/list.yml +4 -0
  64. data/spec/fixtures/bodies/GandiV5_Organization/{get.yaml → fetch.yml} +0 -0
  65. data/spec/fixtures/bodies/GandiV5_Organization/list.yml +7 -0
  66. data/spec/fixtures/bodies/GandiV5_Organization_Customer/list.yml +8 -0
  67. data/spec/spec_helper.rb +2 -2
  68. data/spec/units/gandi_v5/billing_spec.rb +2 -2
  69. data/spec/units/gandi_v5/data/converter/integer_spec.rb +16 -0
  70. data/spec/units/gandi_v5/domain/availability_spec.rb +1 -1
  71. data/spec/units/gandi_v5/domain/live_dns_spec.rb +45 -0
  72. data/spec/units/gandi_v5/domain/tld_spec.rb +2 -2
  73. data/spec/units/gandi_v5/domain_spec.rb +294 -65
  74. data/spec/units/gandi_v5/email/forward_spec.rb +92 -0
  75. data/spec/units/gandi_v5/email/mailbox_spec.rb +122 -40
  76. data/spec/units/gandi_v5/email/slot_spec.rb +13 -5
  77. data/spec/units/gandi_v5/live_dns/domain/dnssec_key_spec.rb +128 -0
  78. data/spec/units/gandi_v5/live_dns/{record_set_spec.rb → domain/record_spec.rb} +1 -1
  79. data/spec/units/gandi_v5/live_dns/domain/snapshot_spec.rb +101 -0
  80. data/spec/units/gandi_v5/live_dns/domain/tsig_key_spec.rb +78 -0
  81. data/spec/units/gandi_v5/live_dns/domain_spec.rb +299 -120
  82. data/spec/units/gandi_v5/live_dns_spec.rb +0 -12
  83. data/spec/units/gandi_v5/organization/customer_spec.rb +81 -0
  84. data/spec/units/gandi_v5/organization_spec.rb +52 -1
  85. data/spec/units/gandi_v5_spec.rb +139 -30
  86. metadata +68 -95
  87. data/doc/GandiV5.html +0 -1183
  88. data/doc/GandiV5/Billing.html +0 -293
  89. data/doc/GandiV5/Billing/Info.html +0 -641
  90. data/doc/GandiV5/Billing/Info/Prepaid.html +0 -817
  91. data/doc/GandiV5/Data.html +0 -785
  92. data/doc/GandiV5/Data/ClassMethods.html +0 -223
  93. data/doc/GandiV5/Data/Converter.html +0 -433
  94. data/doc/GandiV5/Data/Converter/ArrayOf.html +0 -413
  95. data/doc/GandiV5/Data/Converter/Symbol.html +0 -322
  96. data/doc/GandiV5/Data/Converter/Time.html +0 -330
  97. data/doc/GandiV5/Domain.html +0 -16847
  98. data/doc/GandiV5/Domain/AutoRenew.html +0 -1237
  99. data/doc/GandiV5/Domain/Availability.html +0 -1020
  100. data/doc/GandiV5/Domain/Availability/Product.html +0 -988
  101. data/doc/GandiV5/Domain/Availability/Product/Period.html +0 -220
  102. data/doc/GandiV5/Domain/Availability/Product/Price.html +0 -1031
  103. data/doc/GandiV5/Domain/Availability/Tax.html +0 -440
  104. data/doc/GandiV5/Domain/Contact.html +0 -4459
  105. data/doc/GandiV5/Domain/Contract.html +0 -520
  106. data/doc/GandiV5/Domain/Dates.html +0 -1313
  107. data/doc/GandiV5/Domain/RenewalInformation.html +0 -1147
  108. data/doc/GandiV5/Domain/RestoreInformation.html +0 -339
  109. data/doc/GandiV5/Domain/SharingSpace.html +0 -437
  110. data/doc/GandiV5/Domain/TLD.html +0 -1565
  111. data/doc/GandiV5/Email.html +0 -144
  112. data/doc/GandiV5/Email/Mailbox.html +0 -6307
  113. data/doc/GandiV5/Email/Mailbox/Responder.html +0 -1560
  114. data/doc/GandiV5/Email/Offer.html +0 -514
  115. data/doc/GandiV5/Email/Slot.html +0 -4244
  116. data/doc/GandiV5/Error.html +0 -151
  117. data/doc/GandiV5/Error/GandiError.html +0 -270
  118. data/doc/GandiV5/LiveDNS.html +0 -300
  119. data/doc/GandiV5/LiveDNS/Domain.html +0 -2984
  120. data/doc/GandiV5/LiveDNS/RecordSet.html +0 -1593
  121. data/doc/GandiV5/LiveDNS/Zone.html +0 -8891
  122. data/doc/GandiV5/LiveDNS/Zone/Snapshot.html +0 -1556
  123. data/doc/GandiV5/Organization.html +0 -2341
  124. data/doc/_index.html +0 -474
  125. data/doc/class_list.html +0 -51
  126. data/doc/css/common.css +0 -1
  127. data/doc/css/full_list.css +0 -58
  128. data/doc/css/style.css +0 -496
  129. data/doc/file.README.html +0 -175
  130. data/doc/file_list.html +0 -56
  131. data/doc/frames.html +0 -17
  132. data/doc/index.html +0 -175
  133. data/doc/js/app.js +0 -303
  134. data/doc/js/full_list.js +0 -216
  135. data/doc/js/jquery.js +0 -4
  136. data/doc/method_list.html +0 -2427
  137. data/doc/top-level-namespace.html +0 -110
  138. data/lib/gandi_v5/live_dns/record_set.rb +0 -79
  139. data/lib/gandi_v5/live_dns/zone.rb +0 -305
  140. data/lib/gandi_v5/live_dns/zone/snapshot.rb +0 -81
  141. data/spec/features/domain_spec.rb +0 -45
  142. data/spec/features/livedns_domain_spec.rb +0 -8
  143. data/spec/features/livedns_zone_spec.rb +0 -45
  144. data/spec/features/mailbox_spec.rb +0 -18
  145. data/spec/fixtures/bodies/GandiV5_LiveDNS_Domain/get.yaml +0 -4
  146. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/get.yaml +0 -11
  147. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone/list.yaml +0 -11
  148. data/spec/fixtures/bodies/GandiV5_LiveDNS_Zone_Snapshot/list.yaml +0 -3
  149. data/spec/fixtures/vcr/Domain_features/List_domains.yml +0 -54
  150. data/spec/fixtures/vcr/Domain_features/Renew_domain.yml +0 -133
  151. data/spec/fixtures/vcr/LiveDNS_Domain_features/List_domains.yml +0 -32
  152. data/spec/fixtures/vcr/LiveDNS_Zone_features/List_zones.yml +0 -42
  153. data/spec/fixtures/vcr/LiveDNS_Zone_features/Make_and_save_snapshot.yml +0 -72
  154. data/spec/fixtures/vcr/LiveDNS_Zone_features/Save_zone_to_file.yml +0 -28
  155. data/spec/fixtures/vcr/Mailbox_features/List_mailboxes.yml +0 -39
  156. data/spec/units/gandi_v5/live_dns/zone/snapshot_spec.rb +0 -66
  157. data/spec/units/gandi_v5/live_dns/zone_spec.rb +0 -347
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d77e35cfcd8e9488848bc9a988b8b2e79dea364fc014f0ae6e07335adb0e0b95
4
- data.tar.gz: aa3a9b67338ccd330286db829bd593b77a423372175495e30c8098da95713495
3
+ metadata.gz: 6873be5c700e1ef88075c90b71361bb9568b11661661dd0bc4f7d77cfdefd6f0
4
+ data.tar.gz: 13aac04c42357193607cff0f55c0502253fb6b527475e40ad5cb5d53011268ce
5
5
  SHA512:
6
- metadata.gz: ca79e34d1c4ca0b1cc2b54c58c27b6b7326d5a0568f201229270a89487d641221f4b26deac15494a22869ef91e9e5efe00d50b7652db6249febd31f5abf78514
7
- data.tar.gz: 4e87456cd5fde75b7ba2c9fc4076da647c311cfa25ed35e8f85d5406e3766fdd2197210d86e5f81d323c9364cfe79e856e0c7f562a550ff8e8684513ef9f73f8
6
+ metadata.gz: 46afb560fe574db5bf9d47e3e5bbce0843acef12edd132e26cba685608e4b1fa2dc1579dc30e287128ef6462924d56c14856168bcc2d277dededbf9360c45d0b
7
+ data.tar.gz: 9e35714cdb2ad68d57d11f4bdd689a6fc0103d155827682bb6a2f66340e8054af328761827f13e7af857c5c41263568daed84805e20b90e5b580917dea502eab
data/.gitignore CHANGED
@@ -5,6 +5,7 @@ Gemfile.lock
5
5
  # And because this is Ruby, ignore the following
6
6
  # (source: https://github.com/github/gitignore/blob/master/Ruby.gitignore):
7
7
 
8
+ .ruby-version
8
9
  notes.txt
9
10
  todo.txt
10
11
  *.gem
@@ -16,6 +17,7 @@ InstalledFiles
16
17
  lib/bundler/man
17
18
  pkg
18
19
  rdoc
20
+ doc
19
21
  spec/reports
20
22
  test/tmp
21
23
  test/version_tmp
@@ -7,14 +7,24 @@ Gemspec/RequiredRubyVersion:
7
7
  Metrics/AbcSize:
8
8
  Max: 20
9
9
  Metrics/ClassLength:
10
- Max: 200
11
- Metrics/LineLength:
12
- Max: 100
10
+ Max: 250
11
+ Metrics/CyclomaticComplexity:
12
+ Max: 8
13
13
  Metrics/MethodLength:
14
14
  Max: 15
15
15
  Metrics/ModuleLength:
16
16
  Max: 200
17
+ Metrics/ParameterLists:
18
+ Max: 6
17
19
  Style/DocumentationMethod:
18
20
  Enabled: true
21
+ Style/HashEachMethods:
22
+ Enabled: true
23
+ Style/HashTransformKeys:
24
+ Enabled: true
25
+ Style/HashTransformValues:
26
+ Enabled: true
19
27
  Style/SignalException:
20
28
  Enabled: false
29
+ Layout/LineLength:
30
+ Max: 100
@@ -4,6 +4,12 @@ rvm:
4
4
  - 2.6.1
5
5
  - 2.6.2
6
6
  - 2.6.3
7
+ - 2.6.4
8
+ - 2.6.5
9
+ - 2.6.6
10
+ - 2.7.0
11
+ - 2.7.1
12
+ - truffleruby-20.1.0
7
13
  gemfile:
8
14
  - Gemfile
9
15
  branches:
@@ -12,10 +18,18 @@ branches:
12
18
  - staging
13
19
  - /gh(?:\d)+(?:-.+)?/
14
20
  - /dev_ver_\d+\.\d+/
21
+ env:
22
+ global:
23
+ # CC_TEST_REPORTER_ID for reporting test coverage to code climate
24
+ - secure: "C3AcK+/2A4h2+ZayJXc89EQp76o8/2RL03PdtVjWPI6cfBSwN174ImWSdIcs6+Bjv8GH+bADsM4epkTjI7H24wh80If/4jAZJMB6LsAxVC3rZVx2UfDghp1Lwcy6BkNx4VVXMQJUR4rA8fXNd1l6n2a72RbPhTaGYxggw+yiKYNjj5m/u3HWPzTQ9wIx/rLzb2shQU1P9tDX4eRqJixYsd8LvStvXewUKlTQSaxNczzfcSOmeJrrytJGuPQxgBx67hlN40cs84oEbhndjlekZRwYepsRcan9umJEDHnE+k0wLlz/vb2cshYp5tdcfkqspaEhUSV7Vr7ZQNIppI3XyY1hs/pTYc2Vytp3OiY0EXBjKRmiHcnmA8EIkrV9i4OSt6Af3EQJaYU56a0BCaEqzRoQJWOZDS8bVowuO4rY8/xINQBwTojIYAplI/vqX/7xvlRbzIgeWdpvQipPC01d2JtmI/5D1FdGWtzYcDCTRTbHyWmjhr7Jt8qEDMFkbpkcAQiS61baEQ0p4CxaLYm/lpPco1U3e/gMOb/EXDhOrF1I8lSBmVJE/Uz2/3kfOa1DQSxDSRmV1nU3pSd7PUi25Pdx0rezJjRl1UC2gnsNZrCLbplk+VkImXTt3iirV/RuHDo+YVT0efaws7TVH7Uf87jqWf4VZEw/KI3tzfF43CE="
15
25
  before_install: gem update bundler
26
+ before_script:
27
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter && chmod +x ./cc-test-reporter && ./cc-test-reporter before-build
16
28
  script:
17
- - bundle exec rubocop
29
+ - if [[ $(echo $TRAVIS_JOB_NUMBER | awk -F . '{ print $2 }') == '1' ]]; then bundle exec rubocop; fi
18
30
  - bundle exec rspec
31
+ after_script:
32
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
19
33
  notifications:
20
34
  slack:
21
35
  on_success: always
@@ -1,5 +1,68 @@
1
1
  # Gandi V5 API Gem Changelog
2
2
 
3
+ ## Version 0.7.0
4
+
5
+ * LiveDNS:
6
+ * Rename LiveDNS::RecordSet to LiveDNS::Domain::Record
7
+ * Domains:
8
+ * .list now returns an array of strings
9
+ * Can no longer change the zone used by a domain
10
+ * Added automatic_snapshots attribute for whether snapshots are automatically created when a modification is made to this domain's records
11
+ * #replace_records and #replace_records_for merged into #replace_records
12
+ * If replacing with a zone file use the new #replace_zone_lines
13
+ * Added:
14
+ * .create
15
+ * .record_types
16
+ * .generic_name_servers(fqdn)
17
+ * #name_servers and #fetch_name_servers
18
+ * #tsig_keys, #fetch_tsig_keys, #add_tsig_key, #remove_tsig_key
19
+ * #axfr_clients, #fetch_axfr_clients, #add_axfr_client, #remove_axfr_client
20
+ * ::DnssecKeys, #dnssec_keys, #fetch_dnssec_keys
21
+ * Snapshots:
22
+ * Moved to live under LiveDNS::Domain not LiveDNS::Zone
23
+ * Are now accessed via the fully qualified domain name NOT the zone's UUID
24
+ * Ability to access the zone from a snapshot is removed
25
+ * Taking a snapshot now allows for named snapshots
26
+ * Added automatic attribute for when a snapshot was taken due to a zone change
27
+ * .list now returns an array of snapshots (records are fetched in a seperate request when first needed)
28
+ * Zone removed.
29
+
30
+ ## Version 0.6.0
31
+
32
+ * GandiV5::Email::Slot.create now supports sharing_id
33
+ * GandiV5::Email::Slot.create's type argument is now named not positional
34
+ * Add reseller information to GandiV5::Domain
35
+
36
+ ## Version 0.5.0
37
+
38
+ * Add support for truffleruby 20.1.0
39
+ * Fix issue with rails in production
40
+
41
+ ## Version 0.4.0
42
+
43
+ * Fix exception when delete returns no content-type
44
+ * Add support for ruby 2.7.0
45
+ * Add up/downgrading mailbox offer
46
+ * Add dry run option to creating a mailbox
47
+ * Add sharing_id & dry run option for renewing domain
48
+ * Add listing customers under a reseller organization (GandiV5::Organization::Customer.list and GandiV5::Organization#customers)
49
+ * Add creating customer under a reseller organization (GandiV5::Organization::Customer.create and GandiV5::Organization#create_customer)
50
+
51
+ ## Version 0.3.0
52
+
53
+ * Additions to GandiV5::Domain
54
+ * Glue record management
55
+ * LiveDNS management
56
+ * Name server management
57
+ * Update GandiV5::Domain.create to allow purchasing as a reseller and billing to a different organization
58
+ * Add forwarding address management to GandiV5::Email::Forwarding
59
+ * Add GandiV5::Organization.list
60
+ * Uses Zeitwerk for auto loading
61
+ * Add aliasing methods:
62
+ * GandiV5::Domain.mailboxes -> GandiV5::Email::Mailbox.list
63
+ * GandiV5::Domain.mailbox_slots -> GandiV5::Email::Slot.list
64
+ * GandiV5::Domain.email_forwards -> GandiV5::Email::Forward.list
65
+
3
66
  ## Version 0.2.0
4
67
 
5
68
  * Enhancements to GandiV5::Domain
@@ -0,0 +1,10 @@
1
+ github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
2
+ patreon: robertgauld
3
+ open_collective: # Replace with a single Open Collective username
4
+ ko_fi: # Replace with a single Ko-fi username
5
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
6
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
7
+ liberapay: # Replace with a single Liberapay username
8
+ issuehunt: # Replace with a single IssueHunt username
9
+ otechie: # Replace with a single Otechie username
10
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
data/LICENSE.md CHANGED
@@ -1,14 +1,10 @@
1
- ##Copyright
2
- Copyright (c) 2018, Robert Gauld. All rights reserved.
3
-
4
-
5
- ##License
1
+ ## License
6
2
  This code can be used under the BSD License (reproduced below).
7
3
  Commiters to the project give Robert Gauld the right to redistribute their commits
8
4
  under the BSD license.
9
5
 
10
6
 
11
- ###BSD License
7
+ ### BSD License
12
8
  Redistribution and use in source and binary forms, with or without modification,
13
9
  are permitted provided that the following conditions are met:
14
10
 
data/README.md CHANGED
@@ -1,29 +1,18 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/gandi_v5.png)](http://badge.fury.io/rb/gandi_v5)
2
-
3
- Master branch:
4
2
  [![Build Status](https://secure.travis-ci.org/robertgauld/gandi_v5.png?branch=master)](http://travis-ci.org/robertgauld/gandi_v5)
5
3
  [![Coveralls Status](https://coveralls.io/repos/robertgauld/gandi_v5/badge.png?branch=master)](https://coveralls.io/r/robertgauld/gandi_v5)
6
4
  [![Code Climate](https://codeclimate.com/github/robertgauld/gandi_v5.png?branch=master)](https://codeclimate.com/github/robertgauld/gandi_v5)
7
-
8
- Staging branch:
9
- [![Build Status](https://secure.travis-ci.org/robertgauld/gandi_v5.png?branch=staging)](http://travis-ci.org/robertgauld/gandi_v5)
10
- [![Coveralls Status](https://coveralls.io/repos/robertgauld/gandi_v5/badge.png?branch=staging)](https://coveralls.io/r/robertgauld/gandi_v5)
11
-
12
-
13
- ## Build State
14
- This project uses continuous integration to help ensure that a quality product is delivered.
15
- Travis CI monitors two branches (versions) of the code:
16
-
17
- * Master (which is what gets released)
18
- * Staging (which is what is currently being developed ready for moving to master).
19
-
5
+ [![security](https://hakiri.io/github/robertgauld/gandi_v5/master.svg)](https://hakiri.io/github/robertgauld/gandi_v5/master)
20
6
 
21
7
  ## Ruby Versions
22
8
  This gem supports the following versions of ruby, it may work on other versions but is not tested against them so don't rely on it.
23
9
 
24
10
  * ruby:
25
- * 2.6.0 - 2.6.3
11
+ * 2.6.0 - 2.6.6
12
+ * 2.7.0 - 2.7.1
13
+ * truffleruby 20.1.0
26
14
  * jruby, once it's reached parity with ruby 2.6.x
15
+ * rubinius, once it's reached parity with ruby 2.6.x
27
16
 
28
17
 
29
18
  ## Gandi V5
@@ -47,12 +36,12 @@ Details of the API can be found at:
47
36
  If you're using bundler then add it to your Gemfile and run the bundle command.
48
37
 
49
38
  ```ruby
50
- gem 'gandi_v5', '~> 0.1'
39
+ gem 'gandi_v5', '~> 0.7'
51
40
  ```
52
41
 
53
42
  If you're not using bundler then install it from the command line.
54
43
  ```bash
55
- gem install gandi_v5 -v '~> 0.1'
44
+ gem install gandi_v5 -v '~> 0.7'
56
45
  ```
57
46
 
58
47
  ## Usage
@@ -86,9 +75,15 @@ TODO: More examples!
86
75
 
87
76
  We follow the [Semantic Versioning](http://semver.org/) concept.
88
77
 
89
- | Gem Version | Gandi API Release Date |
90
- | --------------- | ---------------------- |
91
- | 0.1.0 | 2019-05-16 |
78
+ | Gem Version | Gandi API Release Date |
79
+ | --------------- | ------------------------ |
80
+ | 0.7.0 | 2020-05-07 |
81
+ | 0.6.0 | 2020-05-07 (not LiveDNS) |
82
+ | 0.5.0 | 2019-10-01 |
83
+ | 0.4.0 | 2019-10-01 |
84
+ | 0.3.0 | 2019-08-22 |
85
+ | 0.2.0 | 2019-05-16 |
86
+ | 0.1.0 | 2019-05-16 |
92
87
 
93
88
  See <https://api.gandi.net/docs/reference#API-Changelog> to find out what
94
89
  Gandi changed on each date.
@@ -22,8 +22,9 @@ Gem::Specification.new do |gem|
22
22
 
23
23
  gem.add_dependency 'dotenv', '~> 2.5'
24
24
  gem.add_dependency 'rest-client', '>= 2', '< 3'
25
+ gem.add_dependency 'zeitwerk', '~> 2.1'
25
26
 
26
- gem.add_development_dependency 'coveralls', '~> 0.7'
27
+ gem.add_development_dependency 'coveralls', '~> 0.8'
27
28
  gem.add_development_dependency 'guard', '~> 2.15'
28
29
  gem.add_development_dependency 'guard-bundler', '~> 2.2'
29
30
  gem.add_development_dependency 'guard-rspec', '~> 4.2', '>= 4.2.5'
@@ -37,5 +38,5 @@ Gem::Specification.new do |gem|
37
38
  gem.add_development_dependency 'simplecov', '~> 0.7'
38
39
  gem.add_development_dependency 'timecop', '~> 0.5'
39
40
  gem.add_development_dependency 'vcr', '~> 4.0'
40
- gem.add_development_dependency 'webmock', '~> 3.5'
41
+ gem.add_development_dependency 'webmock', '~> 3.6'
41
42
  end
@@ -1,17 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'gandi_v5/version'
4
- require_relative 'gandi_v5/data'
5
- require_relative 'gandi_v5/error'
6
-
7
- require_relative 'gandi_v5/billing'
8
- require_relative 'gandi_v5/domain'
9
- require_relative 'gandi_v5/email'
10
- require_relative 'gandi_v5/live_dns'
11
- require_relative 'gandi_v5/organization'
12
-
13
3
  require 'rest_client'
14
4
  require 'securerandom'
5
+ require 'zeitwerk'
6
+
7
+ # Custom inflector for Zeitwerk.
8
+ class MyInflector < Zeitwerk::Inflector
9
+ # Convert file's base name to class name when
10
+ # Zeitwerk's included inflector gets it wrong.
11
+ # @param basename [String] the file's base name (no path or extension)
12
+ # @param abspath [String] the file's absolute path
13
+ # @return [String] the class name
14
+ def camelize(basename, _abspath)
15
+ case basename
16
+ when 'live_dns'
17
+ 'LiveDNS'
18
+ when 'tld'
19
+ 'TLD'
20
+ when 'version'
21
+ 'VERSION'
22
+ else
23
+ super
24
+ end
25
+ end
26
+ end
27
+
28
+ loader = Zeitwerk::Loader.for_gem
29
+ loader.inflector = MyInflector.new
30
+ loader.setup
15
31
 
16
32
  # Namespace for classes which access the Gandi V5 API.
17
33
  # Also provides useful methods and constants for them.
@@ -66,6 +82,36 @@ class GandiV5
66
82
  handle_bad_request(e)
67
83
  end
68
84
 
85
+ # Might raise:
86
+ # * RestClient::NotFound
87
+ # * RestClient::Unauthorized
88
+ # Bad authentication attempt because of a wrong API Key.
89
+ # * RestClient::Forbidden
90
+ # Access to the resource is denied.
91
+ # Mainly due to a lack of permissions to access it.
92
+ # * GandiV5::Error
93
+ # * JSON::ParserError
94
+ def paginated_get(url, page = (1..), per_page = 100, **headers)
95
+ unless page.respond_to?(:each)
96
+ fail ArgumentError, 'page must be positive' unless page.positive?
97
+
98
+ page = [page]
99
+ end
100
+
101
+ headers[:params] ||= {}
102
+ headers[:params].transform_keys!(&:to_s)
103
+ headers[:params]['per_page'] = per_page
104
+
105
+ page.each do |page_number|
106
+ headers[:params]['page'] = page_number
107
+ _resp, this_data = get(url, **headers)
108
+ break if this_data.empty?
109
+
110
+ yield this_data
111
+ break if this_data.count < per_page
112
+ end
113
+ end
114
+
69
115
  # Might raise:
70
116
  # * RestClient::NotFound
71
117
  # * RestClient::Unauthorized
@@ -79,7 +125,10 @@ class GandiV5
79
125
  def delete(url, **headers)
80
126
  prepare_headers headers, url
81
127
  response = RestClient.delete url, **headers
82
- [response, parse_response(response)]
128
+ [
129
+ response,
130
+ response.headers.key?(:content_type) ? parse_response(response) : nil
131
+ ]
83
132
  rescue RestClient::BadRequest => e
84
133
  handle_bad_request(e)
85
134
  end
@@ -150,16 +199,6 @@ class GandiV5
150
199
  @api_key ||= ENV.fetch('GANDI_API_KEY')
151
200
  end
152
201
 
153
- def authorisation_header(url)
154
- if url.start_with?(BASE)
155
- { Authorization: "Apikey #{api_key}" }
156
- elsif url.start_with?(GandiV5::LiveDNS::BASE)
157
- { 'X-Api-Key': api_key }
158
- else
159
- fail ArgumentError, "Don't know how to authorise for url: #{url}"
160
- end
161
- end
162
-
163
202
  def parse_response(response)
164
203
  type = response.headers.fetch(:content_type).split(';').first.chomp
165
204
  case type
@@ -177,10 +216,11 @@ class GandiV5
177
216
  end
178
217
  end
179
218
 
180
- def prepare_headers(headers, url)
181
- headers.transform_keys!(&:to_sym)
219
+ def prepare_headers(headers, _url)
220
+ headers.transform_keys! { |key| key.to_s.downcase.to_sym }
182
221
  headers[:accept] ||= 'application/json'
183
- headers.merge!(authorisation_header(url))
222
+ headers[:authorization] = "Apikey #{api_key}"
223
+ headers
184
224
  end
185
225
 
186
226
  def handle_bad_request(exception)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'billing/info'
4
-
5
3
  class GandiV5
6
4
  # Gandi Billing API.
7
5
  # @see https://api.gandi.net/docs/billing
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'info/prepaid'
4
-
5
3
  class GandiV5
6
4
  class Billing
7
5
  # Account's information.
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'data/converter'
4
-
5
3
  class GandiV5
6
4
  # Addin providing a DSL to manage declaring attributes and how to map
7
5
  # and convert to/from Gandi's fields.
@@ -181,9 +179,8 @@ class GandiV5
181
179
  define_method "#{name}=" do |value|
182
180
  instance_variable_set("@#{name}", value)
183
181
  end
184
- # rubocop:disable Style/AccessModifierDeclarations
182
+
185
183
  private "#{name}="
186
- # rubocop:enable Style/AccessModifierDeclarations
187
184
  end
188
185
 
189
186
  # @api private
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'converter/array_of'
4
- require_relative 'converter/symbol'
5
- require_relative 'converter/time'
6
-
7
3
  class GandiV5
8
4
  module Data
9
5
  # Namespace for converters to/from Gandi's format.
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ module Data
5
+ class Converter
6
+ # Methods for converting strings to/from integerss.
7
+ class Integer
8
+ # @param value [Integer]
9
+ # @return [String]
10
+ def self.to_gandi(value)
11
+ return nil if value.nil?
12
+
13
+ value.to_s
14
+ end
15
+
16
+ # @param [String]
17
+ # @return value [Integer]
18
+ def self.from_gandi(value)
19
+ return nil if value.nil?
20
+
21
+ value.to_i
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end