lib/wcc/contentful/simple_client.rb in wcc-contentful-0.2.2 vs lib/wcc/contentful/simple_client.rb in wcc-contentful-0.3.0.pre.rc
- old
+ new
@@ -1,35 +1,61 @@
# frozen_string_literal: true
require_relative 'simple_client/response'
+require_relative 'simple_client/management'
module WCC::Contentful
- ##
# The SimpleClient accesses the Contentful CDN to get JSON responses,
- # returning the raw JSON data as a parsed hash.
+ # returning the raw JSON data as a parsed hash. This is the bottom layer of
+ # the WCC::Contentful gem.
+ #
+ # Note: Do not create this directly, instead create one of
+ # WCC::Contentful::SimpleClient::Cdn, WCC::Contentful::SimpleClient::Preview,
+ # WCC::Contentful::SimpleClient::Management
+ #
# It can be configured to access any API url and exposes only a single method,
# `get`. This method returns a WCC::Contentful::SimpleClient::Response
# that handles paging automatically.
#
# The SimpleClient by default uses 'http' to perform the gets, but any HTTP
# client can be injected by passing a proc as the `adapter:` option.
+ #
+ # @api Client
class SimpleClient
+ attr_reader :api_url
+ attr_reader :space
+
+ # Creates a new SimpleClient with the given configuration.
+ #
+ # @param [String] api_url the base URL of the Contentful API to connect to
+ # @param [String] space The Space ID to access
+ # @param [String] access_token A Contentful Access Token to be sent in the Authorization header
+ # @param [Hash] options The remaining optional parameters, defined below
+ # @option options [Symbol, Object] adapter The Adapter to use to make requests.
+ # Auto-discovered based on what gems are installed if this is not provided.
+ # @option options [String] default_locale The locale query param to set by default.
+ # @option options [String] environment The contentful environment to access. Defaults to 'master'.
+ # @option options [Boolean] no_follow_redirects If true, do not follow 300 level redirects.
def initialize(api_url:, space:, access_token:, **options)
@api_url = URI.join(api_url, '/spaces/', space + '/')
@space = space
@access_token = access_token
- @get_http = SimpleClient.load_adapter(options[:adapter])
+ @adapter = SimpleClient.load_adapter(options[:adapter])
@options = options
@query_defaults = {}
@query_defaults[:locale] = @options[:default_locale] if @options[:default_locale]
- return unless env = options[:environment]
- @api_url = URI.join(@api_url, 'environments/', env + '/')
+ return unless options[:environment].present?
+
+ @api_url = URI.join(@api_url, 'environments/', options[:environment] + '/')
end
+ # performs an HTTP GET request to the specified path within the configured
+ # space and environment. Query parameters are merged with the defaults and
+ # appended to the request.
def get(path, query = {})
url = URI.join(@api_url, path)
Response.new(self,
{ url: url, query: query },
@@ -77,23 +103,24 @@
}.merge(headers || {})
q = @query_defaults.dup
q = q.merge(query) if query
- resp = @get_http.call(url, q, headers, proxy)
+ resp = @adapter.call(url, q, headers, proxy)
if [301, 302, 307].include?(resp.code) && !@options[:no_follow_redirects]
resp = get_http(resp.headers['location'], nil, headers, proxy)
end
resp
end
- ##
# The CDN SimpleClient accesses 'https://cdn.contentful.com' to get raw
# JSON responses. It exposes methods to query entries, assets, and content_types.
# The responses are instances of WCC::Contentful::SimpleClient::Response
# which handles paging automatically.
+ #
+ # @api Client
class Cdn < SimpleClient
def initialize(space:, access_token:, **options)
super(
api_url: options[:api_url] || 'https://cdn.contentful.com/',
space: space,
@@ -104,46 +131,40 @@
def client_type
'cdn'
end
- ##
# Gets an entry by ID
def entry(key, query = {})
resp = get("entries/#{key}", query)
resp.assert_ok!
end
- ##
# Queries entries with optional query parameters
def entries(query = {})
resp = get('entries', query)
resp.assert_ok!
end
- ##
# Gets an asset by ID
def asset(key, query = {})
resp = get("assets/#{key}", query)
resp.assert_ok!
end
- ##
# Queries assets with optional query parameters
def assets(query = {})
resp = get('assets', query)
resp.assert_ok!
end
- ##
# Queries content types with optional query parameters
def content_types(query = {})
resp = get('content_types', query)
resp.assert_ok!
end
- ##
# Accesses the Sync API to get a list of items that have changed since
# the last sync.
#
# If `sync_token` is nil, an initial sync is performed.
# Returns a WCC::Contentful::SimpleClient::SyncResponse
@@ -159,29 +180,10 @@
resp = SyncResponse.new(get('sync', query))
resp.assert_ok!
end
end
- class Management < SimpleClient
- def initialize(space:, management_token:, **options)
- super(
- api_url: options[:api_url] || 'https://api.contentful.com',
- space: space,
- access_token: management_token,
- **options
- )
- end
-
- def client_type
- 'management'
- end
-
- def content_types(**query)
- resp = get('content_types', query)
- resp.assert_ok!
- end
- end
-
+ # @api Client
class Preview < Cdn
def initialize(space:, preview_token:, **options)
super(
api_url: options[:api_url] || 'https://preview.contentful.com/',
space: space,