gandi_v5 0.1.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 (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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d32f073e157edcd88519f82b4dd082943d4ea049e0232de31dc80d6585070fd7
4
+ data.tar.gz: ed3c8d5156a3efed4980f62775affc680e73c59890c3430740e41e27dca04763
5
+ SHA512:
6
+ metadata.gz: a15a87d90b92a53b37544862adb13cf11d21fa7d3737300f2b392b2abc9fa28cc150da48d40d0bb1d63c9a7f5b65dbf13cde7ed8d002e51ab78aac084fb17567
7
+ data.tar.gz: 91812fc13dabdb21e84164a478376d411271aaec1a30be651f1c9af78c9c1d0e521a5af5f6b4162adb1e5a46ff1cd0bc6ce6231bc80e41cd86d2a33d45060f38
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ # Because this is a gem, ignore Gemfile.lock:
2
+
3
+ Gemfile.lock
4
+
5
+ # And because this is Ruby, ignore the following
6
+ # (source: https://github.com/github/gitignore/blob/master/Ruby.gitignore):
7
+
8
+ notes.txt
9
+ todo.txt
10
+ *.gem
11
+ *.rbc
12
+ .bundle
13
+ .config
14
+ coverage
15
+ InstalledFiles
16
+ lib/bundler/man
17
+ pkg
18
+ rdoc
19
+ spec/reports
20
+ test/tmp
21
+ test/version_tmp
22
+ tmp
23
+ gemfiles/*.lock
24
+ .yardoc
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format documentation
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,20 @@
1
+ require:
2
+ - rubocop-performance
3
+ AllCops:
4
+ TargetRubyVersion: 2.6.0
5
+ Gemspec/RequiredRubyVersion:
6
+ Enabled: false
7
+ Metrics/AbcSize:
8
+ Max: 17
9
+ Metrics/ClassLength:
10
+ Max: 200
11
+ Metrics/LineLength:
12
+ Max: 100
13
+ Metrics/MethodLength:
14
+ Max: 15
15
+ Metrics/ModuleLength:
16
+ Max: 200
17
+ Style/DocumentationMethod:
18
+ Enabled: true
19
+ Style/SignalException:
20
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,23 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.6.0
4
+ - 2.6.1
5
+ - 2.6.2
6
+ gemfile:
7
+ - Gemfile
8
+ branches:
9
+ only:
10
+ - master
11
+ - staging
12
+ - /gh(?:\d)+(?:-.+)?/
13
+ - /dev_ver_\d+\.\d+/
14
+ before_install: gem update bundler
15
+ script:
16
+ - bundle exec rubocop
17
+ - bundle exec rspec
18
+ notifications:
19
+ slack:
20
+ on_success: always
21
+ on_failure: always
22
+ rooms:
23
+ - secure: Nx1TmVs32ILAvH3Cv+jX6rZh1hgx3YaY9azC3PIaJba/bF9xXY1l8L4wF0dJGupQlFP3lWN3Y/aPIJo3SNbH+qll9o317105FfTecPWloyiDgWvz5qPz+oh5MImBUs220jW2XsaACfZkGTUsQt8OUCfhtUeUiW+YqqfAZEwnl+0TyTSFBSLKSNdMcT0sKYPb0IuX5WrOspokSoE9+QL5k0cNN8d78MvtUIC6Em5/ffKVbk4TulQhbzyUhIlPDoxVELq16dQ7njyWJb58khOCaJGV7a2NdFvFCJqImFVQPRT5Ad6EJMQ461cdPY5+ZwxDGlIkA5Srt1L+CyV2wJtMarCIPoGQaxuOTVjNiedEmzblg3K9VXkI7Q5LupJ+vOBhtUS54ODYVBnQgoNVPuRe6T81VZ7NCejeest9bqga8QAVVNhKvMvb6l+YXabnPo7okDZM4+4AlaG/pBKWKjxDJ5QXlbRUZqnJt36sA7y3wvIxnYMX45oaqLD9OS8DQ7Va9+9bsPGZnI0oQrkoPGazGnCryvNtEdl+Qy2KSFaocJL7XLavmAYCmqnNGIaO0eiI+VoX9rvOadDNaPJoa6G4YpO+yTBlx1mxLjneY3FfCHZ1lma7UxzV0t0AVYZtnYBalXbw3mvIWEg6PPRI2uXGCvwUBrNCQqonULsRTFSseMw=
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## Version 0.0.1
2
+
3
+ * Initial release.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in gandi_v5.gemspec
6
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ guard :bundler do
4
+ watch(/^Gemfile(?:\.lock)$'/)
5
+ watch(/^.+\.gemspec$'/)
6
+ end
7
+
8
+ # rubocop:disable Metrics/BlockLength
9
+ group :red_green_refactor, halt_on_fail: true do
10
+ group :rspec do
11
+ guard(
12
+ 'rspec',
13
+ all_on_start: true,
14
+ all_after_pass: false,
15
+ notification: :failed,
16
+ cmd: 'bundle exec rspec'
17
+ ) do
18
+ watch(%r{^spec/.+_spec\.rb$})
19
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/units/#{m[1]}_spec.rb" }
20
+ watch('spec/spec_helper.rb') { 'spec' }
21
+ watch(%r{^spec/.+_shared\.rb$}) { 'spec' }
22
+ end
23
+ end
24
+
25
+ group :rubocop do
26
+ guard(
27
+ 'rubocop',
28
+ all_on_start: true,
29
+ all_after_pass: false,
30
+ notification: :failed,
31
+ keep_failed: false,
32
+ cmd: 'bundle exec rubocop'
33
+ ) do
34
+ watch(%r{^lib/(.+)\.rb$}) { |m| [m[0], "spec/units/#{m[1]}_spec.rb"] }
35
+ watch(%r{^spec/.+?/(.+)_spec\.rb$}) { |m| [m[0], "lib/#{m[1]}.rb"] }
36
+ watch(%r{^(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
37
+ end
38
+ end
39
+ end
40
+ # rubocop:enable Metrics/BlockLength
data/LICENSE.md ADDED
@@ -0,0 +1,32 @@
1
+ ##Copyright
2
+ Copyright (c) 2018, Robert Gauld. All rights reserved.
3
+
4
+
5
+ ##License
6
+ This code can be used under the BSD License (reproduced below).
7
+ Commiters to the project give Robert Gauld the right to redistribute their commits
8
+ under the BSD license.
9
+
10
+
11
+ ###BSD License
12
+ Redistribution and use in source and binary forms, with or without modification,
13
+ are permitted provided that the following conditions are met:
14
+
15
+ - Redistributions of source code must retain the above copyright notice,
16
+ this list of conditions and the following disclaimer.
17
+ - Redistributions in binary form must reproduce the above copyright notice,
18
+ this list of conditions and the following disclaimer in the documentation and/or
19
+ other materials provided with the distribution.
20
+ - Neither the name of the project nor the names of its contributors
21
+ may be used to endorse or promote products derived from this software
22
+ without specific prior written permission.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
25
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
27
+ SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
29
+ OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,94 @@
1
+ [![Gem Version](https://badge.fury.io/rb/gandi_v5.png)](http://badge.fury.io/rb/gandi_v5)
2
+
3
+ Master branch:
4
+ [![Build Status](https://secure.travis-ci.org/robertgauld/gandi_v5.png?branch=master)](http://travis-ci.org/robertgauld/gandi_v5)
5
+ [![Coveralls Status](https://coveralls.io/repos/robertgauld/gandi_v5/badge.png?branch=master)](https://coveralls.io/r/robertgauld/gandi_v5)
6
+ [![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
+
20
+
21
+ ## Ruby Versions
22
+ 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
+
24
+ * ruby:
25
+ * 2.6.0 - 2.6.2
26
+ * jruby, once it's reached parity with ruby 2.6.x
27
+
28
+
29
+ ## Gandi V5
30
+
31
+ Make use of Gandi's V5 API.
32
+ See the table in the [Versioning section](#Versioning) to see what Gandi
33
+ API Changes each version is current for.
34
+
35
+ Gandi say: **_"Please note that this API is currently in BETA testing, so care should be taken when used in production._"**
36
+
37
+ But then you were going to be careful anyway as this gem is currently in the version 0.something range weren't you!
38
+
39
+ Details of the API can be found at:
40
+
41
+ * (https://api.gandi.net/docs/)
42
+ * (https://doc.livedns.gandi.net/)
43
+
44
+
45
+ ## Installation
46
+
47
+ If you're using bundler then add it to your Gemfile and run the bundle command.
48
+
49
+ ```ruby
50
+ gem 'gandi_v5', '~> 0.1'
51
+ ```
52
+
53
+ If you're not using bundler then install it from the command line.
54
+ ```bash
55
+ gem install gandi_v5 -v '~> 0.1'
56
+ ```
57
+
58
+ ## Usage
59
+
60
+ ### Setup
61
+
62
+ You'll need you Gandi API KEY, you can get this by logging into Gandi and
63
+ navigating to User Settings -> Change password & configure access restrictions.
64
+
65
+ ```ruby
66
+ require 'gandi_v5' # Unless you're using Bundler
67
+ GandiV5.api_key = '…' # Unless you've set it in the environment variable GANDI_API_KEY
68
+ ```
69
+
70
+ ### Examples
71
+
72
+ #### Domains
73
+
74
+ ```ruby
75
+ # Get an array of all your domains.
76
+ domains = GandiV5::Domain.list
77
+
78
+ # Since each domain has only basic information, lets get all of the information.
79
+ domains.map!(&:refresh)
80
+ ```
81
+
82
+ TODO: More examples!
83
+
84
+
85
+ ## Versioning
86
+
87
+ We follow the [Semantic Versioning](http://semver.org/) concept.
88
+
89
+ | Gem Version | Gandi API Release Date |
90
+ | --------------- | ---------------------- |
91
+ | 0.1.0 | 2019-05-16 |
92
+
93
+ See (https://api.gandi.net/docs/reference#API-Changelog) to find out what
94
+ Gandi changed on each date.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
data/TODO.md ADDED
@@ -0,0 +1,29 @@
1
+ # To Do List
2
+
3
+ * Domain:
4
+ * [ ] .restore_information - test when I have a restorable domain
5
+ * [ ] .create - return created domain
6
+ * [ ] .availability - return a new type of object
7
+ * [ ] .tld * return a new type of object
8
+ * Email Mailbox:
9
+ * [ ] .create - check type is valid
10
+ * [ ] .create - check a slot is available
11
+ * [ ] .create - fetch created mailbox
12
+ * Email Slot:
13
+ * [ ] #delete - check for inactiveness
14
+ * [ ] #delete - check for refundableness
15
+ * [ ] .create - fetch created slot
16
+ * LiveDNS Domain:
17
+ * [ ] #replace_??_records_for - incorporate into #replace_records_for
18
+ * [ ] Make record type a symbol
19
+ * [ ] Add #zone method
20
+ * LiveDNS Zone:
21
+ * [ ] .create - fetch created zone
22
+ * [ ] #replace_??_records_for - incorporate into #replace_records_for
23
+ * [ ] Make record type a symbol
24
+ * [ ] Add #zone method
25
+ * LiveDNS Zone Snapshot:
26
+ * [ ] Move method for getting listing to here
27
+ * Gandi updates from 2019-05-23:
28
+ * [ ] Domain API: Domain hosts (glue records)
29
+ * [ ] Domain API: Domain nameservers
data/bin/console ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ Dotenv.load
5
+
6
+ unless ENV.key?('GANDI_API_KEY')
7
+ puts 'YOU MUST SET YOUR API KEY -> GandiV5.api_key = \'…\''
8
+ puts 'You can avoid having to do this by'
9
+ puts 'setting the environment variable GANDI_API_KEY.'
10
+ end
11
+
12
+ require 'irb'
13
+ IRB.start
data/gandi_v5.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+ require File.join(File.dirname(__FILE__), 'lib', 'gandi_v5', 'version')
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'gandi_v5'
8
+ gem.license = 'BSD 3 clause'
9
+ gem.version = GandiV5::VERSION
10
+ gem.authors = ['Robert Gauld']
11
+ gem.email = ['robert@robertgauld.co.uk']
12
+ gem.homepage = 'https://github.com/robertgauld/gandi_v5'
13
+ gem.summary = 'Make use of Gandi\'s V5 API.'
14
+
15
+ gem.files = `git ls-files`.split("\n")
16
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ gem.require_paths = ['lib']
19
+
20
+ gem.required_ruby_version = '>= 2.4'
21
+ gem.required_rubygems_version = '>= 2.6.14'
22
+
23
+ gem.add_dependency 'dotenv', '~> 2.5'
24
+ gem.add_dependency 'rest-client', '>= 2', '< 3'
25
+
26
+ gem.add_development_dependency 'coveralls', '~> 0.7'
27
+ gem.add_development_dependency 'guard', '~> 2.15'
28
+ gem.add_development_dependency 'guard-bundler', '~> 2.2'
29
+ gem.add_development_dependency 'guard-rspec', '~> 4.2', '>= 4.2.5'
30
+ gem.add_development_dependency 'guard-rubocop', '~> 1.3'
31
+ gem.add_development_dependency 'rake', '~> 12.0'
32
+ gem.add_development_dependency 'rb-inotify', '~> 0.9'
33
+ gem.add_development_dependency 'rspec', '>= 3.7', '< 4'
34
+ gem.add_development_dependency 'rspec-its', '~> 1.3'
35
+ gem.add_development_dependency 'rubocop', '~> 0.67'
36
+ gem.add_development_dependency 'rubocop-performance', '~> 1.1'
37
+ gem.add_development_dependency 'simplecov', '~> 0.7'
38
+ gem.add_development_dependency 'timecop', '~> 0.5'
39
+ gem.add_development_dependency 'vcr', '~> 4.0'
40
+ gem.add_development_dependency 'webmock', '~> 3.5'
41
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ class Billing
5
+ class Info
6
+ # Account's prepaid information.
7
+ # @!attribute [r] amount
8
+ # @return [Numeric] current amount available in the prepaid account.
9
+ # @!attribute [r] currency
10
+ # @return [String] currency in use for the prepaid account.
11
+ # @!attribute [r] warning_threshold
12
+ # @return [Numeric] amount under which a warning email is sent.
13
+ # @!attribute [r] created_at
14
+ # @return [Time] creation date of the prepaid account.
15
+ # @!attribute [r] updated_at
16
+ # @return [Time] last modification date of the prepaid account.
17
+ class Prepaid
18
+ include GandiV5::Data
19
+
20
+ members :amount, :currency, :warning_threshold
21
+ member :created_at, converter: GandiV5::Data::Converter::Time
22
+ member :updated_at, converter: GandiV5::Data::Converter::Time
23
+
24
+ # Check if current balance is below the warning threshold.
25
+ def warning?
26
+ return nil if warning_threshold.nil?
27
+
28
+ amount < warning_threshold
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'info/prepaid'
4
+
5
+ class GandiV5
6
+ class Billing
7
+ # Account's information.
8
+ # @!attribute [r] annual_balance
9
+ # @return [Numeric] amount of purchased over the past 12 months since the request.
10
+ # @!attribute [r] outstanding_amount
11
+ # @return [Numeric] amount of outstanding orders (payment by terms) since the last invoice.
12
+ # @!attribute [r] grid
13
+ # @return [String] price rate that is applied
14
+ # depending on the amount purchased over the last 12 months.
15
+ # @!attribute [r] prepaid_monthly_invoice
16
+ # @return [nil, Boolean] whether orders are gathered into a single monthly invoice.
17
+ # @!attribute [r] prepaid
18
+ # @return [nil, Gandiv5::Billing::Info::Prepaid]
19
+ class Info
20
+ include GandiV5::Data
21
+
22
+ members :annual_balance, :grid, :outstanding_amount, :prepaid_monthly_invoice
23
+ member :prepaid, converter: GandiV5::Billing::Info::Prepaid
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'billing/info'
4
+
5
+ class GandiV5
6
+ # Gandi Billing API.
7
+ # @see https://api.gandi.net/docs/billing
8
+ class Billing
9
+ # Get account info (defaults to currently authenticated user).
10
+ # @see https://api.gandi.net/docs/billing#get-v5-billing-info
11
+ # @param url [sharing_id] the Sharing ID of the organisation to get info for
12
+ # defaults to the user the api key belomgs to.
13
+ # @return [GandiV5::Billing::Info]
14
+ # @raise [GandiV5::Error::GandiError::GandiError] if Gandi returns an error.
15
+ def self.info(sharing_id = nil)
16
+ data = GandiV5.get url(sharing_id)
17
+ GandiV5::Billing::Info.from_gandi data
18
+ end
19
+
20
+ private
21
+
22
+ def self.url(sharing_id = nil)
23
+ "#{BASE}billing/info" +
24
+ (sharing_id ? "/#{CGI.escape sharing_id}" : '')
25
+ end
26
+ private_class_method :url
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ module Data
5
+ class Converter
6
+ # Used for applying the same converter to each item in an array.
7
+ class ArrayOf
8
+ # @param converter the converter to apply to each item in the array.
9
+ def initialize(converter)
10
+ @converter = converter
11
+ end
12
+
13
+ # @param value [Array<Object>]
14
+ # @return [Array<Object>]
15
+ def to_gandi(value)
16
+ return nil if value.nil?
17
+
18
+ value.map { |item| converter.to_gandi(item) }
19
+ end
20
+
21
+ # @param [Array<Object>]
22
+ # @return value [Array<Object>]
23
+ def from_gandi(value)
24
+ return nil if value.nil?
25
+
26
+ value.map { |item| converter.from_gandi(item) }
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :converter
32
+ end
33
+ end
34
+ end
35
+ end
@@ -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 symbols.
7
+ class Symbol
8
+ # @param value [Symbol]
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 [Symbol]
18
+ def self.from_gandi(value)
19
+ return nil if value.nil?
20
+
21
+ value.to_sym
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class GandiV5
4
+ module Data
5
+ class Converter
6
+ # Methods for converting times to/from Gandi ("2019-02-13T11:04:18Z").
7
+ class Time
8
+ # Convert a time to Gandi's prefered string format.
9
+ # @param value [Time]
10
+ # @return [String]
11
+ def self.to_gandi(value)
12
+ return nil if value.nil?
13
+
14
+ value.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
15
+ end
16
+
17
+ # Convert a time from Gandi's prefered string format.
18
+ # @param [String]
19
+ # @return value [Time]
20
+ def self.from_gandi(value)
21
+ return nil if value.nil?
22
+
23
+ ::Time.parse value
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'converter/array_of'
4
+ require_relative 'converter/symbol'
5
+ require_relative 'converter/time'
6
+
7
+ class GandiV5
8
+ module Data
9
+ # Namespace for converters to/from Gandi's format.
10
+ class Converter
11
+ # Initialize a new simple converter.
12
+ # The passed procs will be run at the appropriate time.
13
+ # @param from_gandi [Proc]
14
+ # @param to_gandi [Proc]
15
+ def initialize(from_gandi: nil, to_gandi: nil)
16
+ @from_gandi_proc = from_gandi
17
+ @to_gandi_proc = to_gandi
18
+ end
19
+
20
+ # @param value [Object]
21
+ # @return [Object]
22
+ def to_gandi(value)
23
+ return value unless to_gandi_proc
24
+
25
+ to_gandi_proc.call value
26
+ end
27
+
28
+ # @param [Object]
29
+ # @return value [Object]
30
+ def from_gandi(value)
31
+ return value unless from_gandi_proc
32
+
33
+ from_gandi_proc.call value
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :from_gandi_proc, :to_gandi_proc
39
+ end
40
+ end
41
+ end