cfc 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 563b2293943b85d67b3dff9d612481addd9dc32272647691d891d3376ccdcf92
4
- data.tar.gz: efa22237c80919923fe33a514bbb8779fd9bd9f36d568cf52c56f1f36bf02553
3
+ metadata.gz: 820b83bedc1e954528d342f7060a43f05e1ca108293a0a6ec180604f1afbfa6b
4
+ data.tar.gz: 6425fb5bade05ada6d104b10d6ef5bbf6817c9a10a7336645dcdb39bdb7486f3
5
5
  SHA512:
6
- metadata.gz: 9b3de0e73d175282548bbf7c1e67a547d2942285feec299c3cb094af4bb836f10de4814039dc88e7df481b96c4b6a7276b3f559b353abb3b8147aacc12cf7f2f
7
- data.tar.gz: 1b709a15c173a3d9b0476469a785e65f90d8d5e0cc76da60f20a34b2f821ae0dc6a4ebf8dba4d515df9c0f70800eef9cdb2c1865d75cc728e72322ca12d23678
6
+ metadata.gz: af74f88b7fa189a2ff33a4ed8ca365e6fcfd3fc89711da0b5db369c07f1df9f1a17d08093e333c9651520c7dcf611f0a620bca49a8519e5c1083b5d028d97077
7
+ data.tar.gz: 0d0440c563e99d4bd6e36f2801c7cec242df6aa1b870229169f08d112cb7f518654f714fae3c38a6acc5a526ffa5235a74c9872032f4ca4ba5776602f33f7e03
data/lib/cfc.rb CHANGED
@@ -3,8 +3,11 @@ require_relative 'cfc/config'
3
3
  require_relative 'cfc/version'
4
4
 
5
5
  require_relative 'cfc/objects/account'
6
+ require_relative 'cfc/objects/api_token_policy'
7
+ require_relative 'cfc/objects/permission_group'
6
8
  require_relative 'cfc/objects/record'
7
9
  require_relative 'cfc/objects/user'
10
+ require_relative 'cfc/objects/user_api_token'
8
11
  require_relative 'cfc/objects/zone'
9
12
 
10
13
  module CFC; end
@@ -4,7 +4,7 @@ require 'digest'
4
4
  require 'yaml'
5
5
  require_relative 'config'
6
6
  require_relative 'cache'
7
- require_relative 'errors/http_error.rb'
7
+ require_relative 'errors/http_error'
8
8
 
9
9
  module CFC
10
10
  class API
@@ -21,33 +21,51 @@ module CFC
21
21
  request_json(Net::HTTP::Get, build_uri(path, params), headers: headers, cache: cache, expiry: expiry)
22
22
  end
23
23
 
24
+ def delete(path, data: {}, headers: nil, cache: false, expiry: nil)
25
+ request(Net::HTTP::Delete, URI("#{@base}#{path}"), data: data, headers: headers, cache: cache, expiry: expiry)
26
+ end
27
+
28
+ def delete_to_json(path, data: {}, headers: nil, cache: false, expiry: nil)
29
+ request_json(Net::HTTP::Delete, URI("#{@base}#{path}"), data: data, headers: headers, cache: cache,
30
+ expiry: expiry)
31
+ end
32
+
24
33
  [:post, :put, :patch].each do |method|
25
34
  define_method method do |path, data, headers: nil, cache: false, expiry: nil|
26
- request("Net::HTTP::#{method.capitalize}".constantize, URI("#{@base}#{path}"), data: data, headers: headers, cache: cache, expiry: expiry)
35
+ request("Net::HTTP::#{method.capitalize}".constantize, URI("#{@base}#{path}"), data: data, headers: headers,
36
+ cache: cache, expiry: expiry)
27
37
  end
28
38
 
29
39
  define_method "#{method}_to_json" do |path, data, headers: nil, cache: false, expiry: nil|
30
- request_json(Object.const_get("Net::HTTP::#{method.capitalize}"), URI("#{@base}#{path}"), data: data, headers: headers, cache: cache,
31
- expiry: expiry)
40
+ request_json(Object.const_get("Net::HTTP::#{method.capitalize}"), URI("#{@base}#{path}"), data: data,
41
+ headers: headers, cache: cache, expiry: expiry)
32
42
  end
33
43
  end
34
44
 
35
45
  protected
36
46
 
37
47
  def request(cls, uri, data: nil, headers: nil, cache: true, expiry: nil)
38
- final_headers = (headers || {}).merge({
39
- 'Authorization' => "Bearer #{CFC::Config.instance.token}",
40
- 'Content-Type' => 'application/json'
41
- })
48
+ headers = (headers || {}).merge({ 'Content-Type' => 'application/json' })
49
+ @auth_method = CFC::Config.instance.token.nil? ? :key : :token
50
+
51
+ case @auth_method
52
+ when :token
53
+ headers.merge!({ 'Authentication' => "Bearer #{CFC::Config.instance.token}" })
54
+ when :key
55
+ headers.merge!({
56
+ 'X-Auth-Key' => CFC::Config.instance.api_key,
57
+ 'X-Auth-Email' => CFC::Config.instance.api_email
58
+ })
59
+ end
42
60
 
43
- rq = cls.new(uri, final_headers)
61
+ rq = cls.new(uri, headers)
44
62
  unless data.nil? || rq.is_a?(Net::HTTP::Head)
45
63
  rq.body = JSON.dump(data)
46
64
  end
47
65
 
48
66
  response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
49
67
  if cache
50
- @cache.fetch(Digest::SHA256.hexdigest("#{uri}|#{JSON.dump(final_headers)}"), expiry: expiry) do
68
+ @cache.fetch(Digest::SHA256.hexdigest("#{uri}|#{JSON.dump(headers)}"), expiry: expiry) do
51
69
  http.request(rq)
52
70
  end
53
71
  else
@@ -37,6 +37,6 @@ module CFC
37
37
  end
38
38
  end
39
39
 
40
- alias_method :valid?, :include?
40
+ alias valid? include?
41
41
  end
42
42
  end
@@ -1,12 +1,19 @@
1
1
  require 'singleton'
2
+ require_relative 'errors/configuration_error'
2
3
 
3
4
  module CFC
4
5
  class Config
5
6
  include Singleton
6
- attr_accessor :token
7
+ attr_accessor :token, :api_key, :api_email
7
8
 
8
9
  def self.configure
9
10
  yield CFC::Config.instance
11
+ if [instance.token, instance.api_key, instance.api_email].all?(&:nil?)
12
+ raise CFC::Errors::ConfigurationError, 'Either `token` or BOTH of `api_key`, `api_email` must be set on call ' \
13
+ "to `configure'."
14
+ elsif instance.token.nil? && [instance.api_key, instance.api_email].any?(&:nil?)
15
+ raise CFC::Errors::ConfigurationError, 'Both `api_key` AND `api_email` must be set when not using token auth.'
16
+ end
10
17
  end
11
18
  end
12
- end
19
+ end
@@ -0,0 +1,6 @@
1
+ module CFC
2
+ module Errors
3
+ class ConfigurationError < StandardError
4
+ end
5
+ end
6
+ end
@@ -2,12 +2,8 @@ module CFC
2
2
  module Errors
3
3
  class MissingProperty < StandardError
4
4
  def self.default_message(obj, property)
5
- "This #{obj.class.name} does not have a `#{property}' property. If you are accessing this object from a relationship on " \
6
- "another object, the property may not have been fetched."
7
- end
8
-
9
- def initialize(message)
10
- super
5
+ "This #{obj.class.name} does not have a `#{property}' property. If you are accessing this object from a " \
6
+ 'relationship on another object, the property may not have been fetched.'
11
7
  end
12
8
  end
13
9
  end
@@ -2,8 +2,5 @@ require_relative 'object'
2
2
 
3
3
  module CFC
4
4
  class Account < CFC::APIObject
5
- def initialize(data)
6
- super(data)
7
- end
8
5
  end
9
6
  end
@@ -0,0 +1,8 @@
1
+ require_relative 'object'
2
+ require_relative 'permission_group'
3
+
4
+ module CFC
5
+ class APITokenPolicy < CFC::APIObject
6
+ relationship :permission_groups, CFC::PermissionGroup, multiple: true
7
+ end
8
+ end
@@ -5,8 +5,8 @@ module CFC
5
5
  class APIObject
6
6
  @relationships = []
7
7
 
8
- def self.relationships
9
- @relationships
8
+ class << self
9
+ attr_reader :relationships
10
10
  end
11
11
 
12
12
  def initialize(data)
@@ -23,7 +23,7 @@ module CFC
23
23
  CFC::Errors::MissingProperty.default_message(self, name)
24
24
  end
25
25
  end
26
-
26
+
27
27
  def respond_to_missing?(name, *_args, **_opts)
28
28
  @data.include?(name.to_s)
29
29
  end
@@ -32,24 +32,32 @@ module CFC
32
32
  "#<#{self.class.name}:0x#{(object_id << 1).to_s(16)} #{@data.map { |k, v| "#{k}=#{v.inspect}" }.join(', ')}>"
33
33
  end
34
34
 
35
- alias_method :to_s, :inspect
36
-
37
- protected
35
+ alias to_s inspect
38
36
 
39
- def self.relationship(property, cls)
37
+ def self.relationship(property, cls, multiple: false)
40
38
  unless defined?(@relationships)
41
39
  @relationships = []
42
40
  end
43
- @relationships << [property, cls]
41
+ @relationships << [property, cls, { multiple: multiple }]
42
+ end
43
+
44
+ def self.opts(bind)
45
+ bind.local_variables.map do |var|
46
+ [var, bind.local_variable_get(var)]
47
+ end.to_h
44
48
  end
45
49
 
46
50
  private
47
51
 
48
52
  def initialize_relationships
49
53
  (self.class.relationships || []).each do |rel|
50
- property, cls = rel
51
- @data[property.to_s] = cls.new(@data[property.to_s])
54
+ property, cls, opts = rel
55
+ @data[property.to_s] = if opts[:multiple]
56
+ @data[property.to_s].map { |o| cls.new(o) }
57
+ else
58
+ cls.new(@data[property.to_s])
59
+ end
52
60
  end
53
61
  end
54
62
  end
55
- end
63
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'object'
2
+
3
+ module CFC
4
+ class PermissionGroup < CFC::APIObject
5
+ end
6
+ end
@@ -1,9 +1,7 @@
1
+ require_relative 'object'
2
+
1
3
  module CFC
2
4
  class Record < CFC::APIObject
3
- def initialize(data)
4
- super(data)
5
- end
6
-
7
5
  def proxy
8
6
  set_proxied(true)
9
7
  end
@@ -14,7 +12,7 @@ module CFC
14
12
 
15
13
  private
16
14
 
17
- def set_proxied(to)
15
+ def set_proxied(to) # rubocop:disable Naming/AccessorMethodName
18
16
  @api.patch_to_json("zones/#{zone_id}/dns_records/#{id}", { proxied: to })
19
17
  end
20
18
  end
@@ -2,8 +2,23 @@ require_relative 'object'
2
2
 
3
3
  module CFC
4
4
  class User < CFC::APIObject
5
- def initialize(data)
6
- super(data)
5
+ @api = CFC::API.new
6
+
7
+ # Get full details of the current user.
8
+ def self.details
9
+ new(@api.get_json('user')['result'])
10
+ end
11
+
12
+ # Update part of the current user's details as permitted.
13
+ #
14
+ # @param first_name [String]
15
+ # @param last_name [String]
16
+ # @param telephone [String]
17
+ # @param country [String]
18
+ # @param zipcode [String]
19
+ def self.edit(first_name: nil, last_name: nil, telephone: nil, country: nil, zipcode: nil)
20
+ data = opts(binding)
21
+ @api.patch_to_json('user', data)
7
22
  end
8
23
  end
9
24
  end
@@ -0,0 +1,39 @@
1
+ require_relative 'object'
2
+ require_relative 'api_token_policy'
3
+
4
+ module CFC
5
+ class UserAPIToken < CFC::APIObject
6
+ relationship :policies, CFC::APITokenPolicy, multiple: true
7
+
8
+ @api = CFC::API.new
9
+
10
+ def self.list(page: nil, per_page: nil, direction: nil)
11
+ params = opts(binding).compact
12
+ @api.get_json('user/tokens', params: params)['result'].map { |o| new(o) }
13
+ end
14
+
15
+ def self.details(identifier)
16
+ new(@api.get_json("user/tokens/#{identifier}")['result'])
17
+ end
18
+
19
+ def self.delete(identifier)
20
+ @api.delete_to_json("user/tokens/#{identifier}")
21
+ end
22
+
23
+ def self.roll(identifier)
24
+ @api.put_to_json("user/tokens/#{identifier}/value", {})
25
+ end
26
+
27
+ def details
28
+ CFC::UserAPIToken.details(id)
29
+ end
30
+
31
+ def delete
32
+ CFC::UserAPIToken.delete(id)
33
+ end
34
+
35
+ def roll
36
+ CFC::UserAPIToken.roll(id)
37
+ end
38
+ end
39
+ end
@@ -15,10 +15,6 @@ module CFC
15
15
  data.map { |z| new(z) }
16
16
  end
17
17
 
18
- def initialize(data)
19
- super(data)
20
- end
21
-
22
18
  def purge_all_files
23
19
  @api.post_to_json("zones/#{id}/purge_cache", { purge_everything: true })
24
20
  end
@@ -1,3 +1,3 @@
1
1
  module CFC
2
- VERSION = '0.1.2'
3
- end
2
+ VERSION = '0.1.3'.freeze
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Codidact Foundation
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-31 00:00:00.000000000 Z
11
+ date: 2021-01-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Simple API library for interacting with the Cloudflare API. See GitHub
14
14
  for usage details: https://github.com/codidact/cfc'
@@ -23,12 +23,16 @@ files:
23
23
  - lib/cfc/api.rb
24
24
  - lib/cfc/cache.rb
25
25
  - lib/cfc/config.rb
26
+ - lib/cfc/errors/configuration_error.rb
26
27
  - lib/cfc/errors/http_error.rb
27
28
  - lib/cfc/errors/missing_property.rb
28
29
  - lib/cfc/objects/account.rb
30
+ - lib/cfc/objects/api_token_policy.rb
29
31
  - lib/cfc/objects/object.rb
32
+ - lib/cfc/objects/permission_group.rb
30
33
  - lib/cfc/objects/record.rb
31
34
  - lib/cfc/objects/user.rb
35
+ - lib/cfc/objects/user_api_token.rb
32
36
  - lib/cfc/objects/zone.rb
33
37
  - lib/cfc/version.rb
34
38
  homepage: https://github.com/codidact/cfc
@@ -43,14 +47,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
43
47
  requirements:
44
48
  - - ">="
45
49
  - !ruby/object:Gem::Version
46
- version: 2.1.0
50
+ version: 2.4.0
47
51
  required_rubygems_version: !ruby/object:Gem::Requirement
48
52
  requirements:
49
53
  - - ">="
50
54
  - !ruby/object:Gem::Version
51
55
  version: '0'
52
56
  requirements: []
53
- rubygems_version: 3.0.8
57
+ rubygems_version: 3.0.3
54
58
  signing_key:
55
59
  specification_version: 4
56
60
  summary: Simple API library for interacting with the Cloudflare API.