kontent-ai-delivery 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +21 -0
  3. data/README.md +617 -0
  4. data/bin/console +14 -0
  5. data/bin/setup +8 -0
  6. data/lib/delivery/builders/image_transformation_builder.rb +272 -0
  7. data/lib/delivery/builders/url_builder.rb +123 -0
  8. data/lib/delivery/client/delivery_client.rb +184 -0
  9. data/lib/delivery/client/delivery_query.rb +308 -0
  10. data/lib/delivery/client/request_manager.rb +127 -0
  11. data/lib/delivery/models/content_item.rb +153 -0
  12. data/lib/delivery/models/content_type.rb +41 -0
  13. data/lib/delivery/models/language.rb +29 -0
  14. data/lib/delivery/models/pagination.rb +22 -0
  15. data/lib/delivery/models/taxonomy_group.rb +39 -0
  16. data/lib/delivery/query_parameters/filters.rb +201 -0
  17. data/lib/delivery/query_parameters/parameter_base.rb +56 -0
  18. data/lib/delivery/query_parameters/query_string.rb +78 -0
  19. data/lib/delivery/resolvers/content_link_resolver.rb +102 -0
  20. data/lib/delivery/resolvers/inline_content_item_resolver.rb +75 -0
  21. data/lib/delivery/resolvers/linked_item_resolver.rb +43 -0
  22. data/lib/delivery/responses/delivery_element_response.rb +34 -0
  23. data/lib/delivery/responses/delivery_item_listing_response.rb +54 -0
  24. data/lib/delivery/responses/delivery_item_response.rb +40 -0
  25. data/lib/delivery/responses/delivery_items_feed_response.rb +58 -0
  26. data/lib/delivery/responses/delivery_language_listing_response.rb +44 -0
  27. data/lib/delivery/responses/delivery_taxonomy_listing_response.rb +47 -0
  28. data/lib/delivery/responses/delivery_taxonomy_response.rb +33 -0
  29. data/lib/delivery/responses/delivery_type_listing_response.rb +46 -0
  30. data/lib/delivery/responses/delivery_type_response.rb +32 -0
  31. data/lib/delivery/responses/response_base.rb +39 -0
  32. data/lib/delivery/tests/401.json +6 -0
  33. data/lib/delivery/tests/429.json +5 -0
  34. data/lib/delivery/tests/fake_responder.rb +99 -0
  35. data/lib/delivery/tests/filtering/items_with_count.json +5385 -0
  36. data/lib/delivery/tests/filtering/pagination.json +762 -0
  37. data/lib/delivery/tests/generic/items/about_us.json +277 -0
  38. data/lib/delivery/tests/generic/items/aeropress_filters.json +156 -0
  39. data/lib/delivery/tests/generic/items/coffee_processing_techniques.json +566 -0
  40. data/lib/delivery/tests/generic/items/empty_rich_text.json +24 -0
  41. data/lib/delivery/tests/generic/items/rich_text_complex_tables.json +81 -0
  42. data/lib/delivery/tests/generic/items/where_does_coffee_come_from_.json +599 -0
  43. data/lib/delivery/tests/generic/items.json +5384 -0
  44. data/lib/delivery/tests/generic/languages.json +24 -0
  45. data/lib/delivery/tests/generic/taxonomies/manufacturer.json +30 -0
  46. data/lib/delivery/tests/generic/taxonomies.json +204 -0
  47. data/lib/delivery/tests/generic/types/brewer/elements/product_status.json +6 -0
  48. data/lib/delivery/tests/generic/types/brewer.json +89 -0
  49. data/lib/delivery/tests/generic/types.json +836 -0
  50. data/lib/delivery/tests/items_feed/articles_feed_1.json +39 -0
  51. data/lib/delivery/tests/items_feed/articles_feed_2.json +78 -0
  52. data/lib/delivery/tests/items_feed/articles_feed_3.json +104 -0
  53. data/lib/kontent-ai-delivery.rb +22 -0
  54. metadata +221 -0
@@ -0,0 +1,40 @@
1
+ require 'delivery/models/content_item'
2
+ require 'delivery/responses/response_base'
3
+
4
+ module Kontent
5
+ module Ai
6
+ module Delivery
7
+ module Responses
8
+ # The response of a successful query for a content item.
9
+ # See https://github.com/kontent-ai/delivery-sdk-ruby#listing-items
10
+ class DeliveryItemResponse < ResponseBase
11
+ # A Kontent::Ai::Delivery::ContentItem object from a
12
+ # Kontent::Ai::Delivery::DeliveryClient.item call.
13
+ #
14
+ # * *Returns*:
15
+ # - Kontent::Ai::Delivery::ContentItem
16
+ def item
17
+ @item unless @item.nil?
18
+ linked_items_resolver = Kontent::Ai::Delivery::Resolvers::LinkedItemResolver.new @response['modular_content'], @content_link_url_resolver, @inline_content_item_resolver
19
+ @item = Kontent::Ai::Delivery::ContentItem.new(
20
+ @response,
21
+ @content_link_url_resolver,
22
+ @inline_content_item_resolver,
23
+ linked_items_resolver
24
+ )
25
+ end
26
+
27
+ def initialize(headers, body, query)
28
+ @response = JSON.parse(body)
29
+ @content_link_url_resolver = query.content_link_url_resolver
30
+ @inline_content_item_resolver = query.inline_content_item_resolver
31
+ super 200,
32
+ "Success, '#{item.system.codename}' returned",
33
+ headers,
34
+ JSON.generate(@response)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ require 'delivery/models/content_item'
2
+ require 'delivery/models/pagination'
3
+ require 'delivery/responses/response_base'
4
+
5
+ module Kontent
6
+ module Ai
7
+ module Delivery
8
+ module Responses
9
+ # The response of a successful query for content items.
10
+ class DeliveryItemsFeedResponse < ResponseBase
11
+ # A collection of Kontent::Ai::Delivery::ContentItem objects from
12
+ # a Kontent::Ai::Delivery::DeliveryClient.items_feed call.
13
+ #
14
+ # * *Returns*:
15
+ # - +Array+ One or more Kontent::Ai::Delivery::ContentItem objects
16
+ def items
17
+ @items unless @items.nil?
18
+ linked_items_resolver = Kontent::Ai::Delivery::Resolvers::LinkedItemResolver.new @response['modular_content'], @content_link_url_resolver, @inline_content_item_resolver
19
+ items = []
20
+ @response['items'].each do |n|
21
+ items << Kontent::Ai::Delivery::ContentItem.new(
22
+ n,
23
+ @content_link_url_resolver,
24
+ @inline_content_item_resolver,
25
+ linked_items_resolver
26
+ )
27
+ end
28
+ @items = items
29
+ end
30
+
31
+ def initialize(headers, body, query)
32
+ @query = query
33
+ @response = JSON.parse(body)
34
+ @content_link_url_resolver = query.content_link_url_resolver
35
+ @inline_content_item_resolver = query.inline_content_item_resolver
36
+ super 200,
37
+ "Success, #{items.length} items returned",
38
+ headers,
39
+ JSON.generate(@response)
40
+ end
41
+
42
+ def next_result
43
+ @query.update_continuation continuation_token
44
+ @query.execute
45
+ end
46
+
47
+ def more_results?
48
+ !continuation_token.nil?
49
+ end
50
+
51
+ def continuation_token
52
+ headers[Kontent::Ai::Delivery::DeliveryQuery::HEADER_CONTINUATION]
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,44 @@
1
+ require 'delivery/models/language'
2
+ require 'delivery/responses/response_base'
3
+
4
+ module Kontent
5
+ module Ai
6
+ module Delivery
7
+ module Responses
8
+ # The response of a successful query for project languages.
9
+ class DeliveryLanguageListingResponse < ResponseBase
10
+ # Parses the 'pagination' JSON node of the response.
11
+ #
12
+ # * *Returns*:
13
+ # - Kontent::Ai::Delivery::Pagination
14
+ def pagination
15
+ @pagination unless @pagination.nil?
16
+ @pagination = Pagination.new @response['pagination']
17
+ end
18
+
19
+ # Parses the 'languages' JSON node of the response from a
20
+ # Kontent::Ai::Delivery::DeliveryClient.languages call.
21
+ #
22
+ # * *Returns*:
23
+ # - +Array+ The content types as Kontent::Ai::Delivery::Language objects
24
+ def languages
25
+ @languages unless @languages.nil?
26
+ languages = []
27
+ @response['languages'].each do |n|
28
+ languages << Kontent::Ai::Delivery::Language.new(n)
29
+ end
30
+ @languages = languages
31
+ end
32
+
33
+ def initialize(headers, body)
34
+ @response = JSON.parse(body)
35
+ super 200,
36
+ "Success, #{languages.length} languages returned",
37
+ headers,
38
+ JSON.generate(@response)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,47 @@
1
+ require 'delivery/models/taxonomy_group'
2
+ require 'delivery/models/pagination'
3
+ require 'delivery/responses/response_base'
4
+
5
+ module Kontent
6
+ module Ai
7
+ module Delivery
8
+ module Responses
9
+ # The response of a successful query for taxonomy groups.
10
+ # See https://github.com/kontent-ai/delivery-sdk-ruby#taxonomy
11
+ class DeliveryTaxonomyListingResponse < ResponseBase
12
+ # Parses the 'pagination' JSON node of the response.
13
+ #
14
+ # * *Returns*:
15
+ # - Kontent::Ai::Delivery::Pagination
16
+ def pagination
17
+ @pagination unless @pagination.nil?
18
+ @pagination = Pagination.new @response['pagination']
19
+ end
20
+
21
+ # Parses the 'taxonomies' JSON node of the response from a
22
+ # Kontent::Ai::Delivery::DeliveryClient.taxonomies call.
23
+ #
24
+ # * *Returns*:
25
+ # - +Array+ The taxonomy groups as Kontent::Ai::Delivery::TaxonomyGroup objects
26
+ def taxonomies
27
+ @taxonomies unless @taxonomies.nil?
28
+ taxonomies = []
29
+ @response['taxonomies'].each do |n|
30
+ taxonomies << Kontent::Ai::Delivery::TaxonomyGroup.new(n)
31
+ end
32
+ @taxonomies = taxonomies
33
+ end
34
+
35
+ def initialize(headers, body)
36
+ @response = JSON.parse(body)
37
+
38
+ super 200,
39
+ "Success, #{taxonomies.length} taxonomies returned",
40
+ headers,
41
+ JSON.generate(@response)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ require 'delivery/models/taxonomy_group'
2
+ require 'delivery/responses/response_base'
3
+
4
+ module Kontent
5
+ module Ai
6
+ module Delivery
7
+ module Responses
8
+ # The response of a successful query for a taxonomy group.
9
+ # See https://github.com/kontent-ai/delivery-sdk-ruby#taxonomy
10
+ class DeliveryTaxonomyResponse < ResponseBase
11
+ # Parses the response from a
12
+ # Kontent::Ai::Delivery::DeliveryClient.taxonomy call.
13
+ #
14
+ # * *Returns*:
15
+ # - Kontent::Ai::Delivery::TaxonomyGroup
16
+ def taxonomy
17
+ @taxonomy unless @taxonomy.nil?
18
+ @taxonomy = Kontent::Ai::Delivery::TaxonomyGroup.new(@response)
19
+ end
20
+
21
+ def initialize(headers, body)
22
+ @response = JSON.parse(body)
23
+
24
+ super 200,
25
+ "Success, '#{taxonomy.system.codename}' returned",
26
+ headers,
27
+ JSON.generate(@response)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ require 'delivery/models/content_type'
2
+ require 'delivery/models/pagination'
3
+ require 'delivery/responses/response_base'
4
+
5
+ module Kontent
6
+ module Ai
7
+ module Delivery
8
+ module Responses
9
+ # The response of a successful query for content types.
10
+ # See https://github.com/kontent-ai/delivery-sdk-ruby#retrieving-content-types
11
+ class DeliveryTypeListingResponse < ResponseBase
12
+ # Parses the 'pagination' JSON node of the response.
13
+ #
14
+ # * *Returns*:
15
+ # - Kontent::Ai::Delivery::Pagination
16
+ def pagination
17
+ @pagination unless @pagination.nil?
18
+ @pagination = Pagination.new @response['pagination']
19
+ end
20
+
21
+ # Parses the 'types' JSON node of the response from a
22
+ # Kontent::Ai::Delivery::DeliveryClient.types call.
23
+ #
24
+ # * *Returns*:
25
+ # - +Array+ The content types as Kontent::Ai::Delivery::ContentType objects
26
+ def types
27
+ @types unless @types.nil?
28
+ types = []
29
+ @response['types'].each do |n|
30
+ types << Kontent::Ai::Delivery::ContentType.new(n)
31
+ end
32
+ @types = types
33
+ end
34
+
35
+ def initialize(headers, body)
36
+ @response = JSON.parse(body)
37
+ super 200,
38
+ "Success, #{types.length} types returned",
39
+ headers,
40
+ JSON.generate(@response)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,32 @@
1
+ require 'delivery/models/content_type'
2
+ require 'delivery/responses/response_base'
3
+
4
+ module Kontent
5
+ module Ai
6
+ module Delivery
7
+ module Responses
8
+ # The response of a successful query for a content type.
9
+ # See https://github.com/kontent-ai/delivery-sdk-ruby#retrieving-content-types
10
+ class DeliveryTypeResponse < ResponseBase
11
+ # A Kontent::Ai::Delivery::ContentType object from a
12
+ # Kontent::Ai::Delivery::DeliveryClient.type call.
13
+ #
14
+ # * *Returns*:
15
+ # - Kontent::Ai::Delivery::ContentType
16
+ def type
17
+ @type unless @type.nil?
18
+ @type = Kontent::Ai::Delivery::ContentType.new(@response)
19
+ end
20
+
21
+ def initialize(headers, body)
22
+ @response = JSON.parse(body)
23
+ super 200,
24
+ "Success, type '#{type.system.codename}' returned",
25
+ headers,
26
+ JSON.generate(@response)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ module Kontent
2
+ module Ai
3
+ module Delivery
4
+ module Responses
5
+ # Base class for all responses from a
6
+ # Kontent::Ai::Delivery::DeliveryQuery.execute call.
7
+ class ResponseBase
8
+ attr_accessor :http_code,
9
+ :message,
10
+ :headers,
11
+ :json
12
+
13
+ # Constructor.
14
+ #
15
+ # * *Args*:
16
+ # - *http_code* (+integer+) The status code returned by the REST request
17
+ # - *message* (+string+) An informative message about the response, visible when calling +to_s+
18
+ # - *headers* (+hash+) _optional_ The headers of the REST response
19
+ # - *json* (+string+) _optional_ The complete, unmodified JSON response from the server
20
+ def initialize(http_code, message, headers = {}, json = '')
21
+ self.http_code = http_code
22
+ self.message = message
23
+ self.headers = headers
24
+ self.json = json
25
+ end
26
+
27
+ # Provides an informative message about the success of the request
28
+ # by combining the status code and message.
29
+ #
30
+ # * *Returns*:
31
+ # - +string+
32
+ def to_s
33
+ "Response is status code #{http_code} with message:\n#{message}"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ {
2
+ "message": "Missing or invalid access token. Please include the valid access token value in the Authorization header field as an HTTP bearer authorization scheme.",
3
+ "request_id": "|89bb1503b14c254a91bd57c135329822.d31c99c5_",
4
+ "error_code": 3,
5
+ "specific_code": 0
6
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "request_id": "80000004-0002-fd00-b63f-84710c7967bb",
3
+ "error_code": 10000,
4
+ "message": "API rate limit exceeded. Please retry your request later."
5
+ }
@@ -0,0 +1,99 @@
1
+ require 'pathname'
2
+ require 'cgi'
3
+ require 'ostruct'
4
+
5
+ module Kontent
6
+ module Ai
7
+ module Delivery
8
+ module Tests
9
+ class FakeResponder
10
+ IS_SECURE = true # Fake Secure Access is enabled for project
11
+ CONTINUATION_HEADER_1 = '+RID:~lmJ4ALSekwpBTQAAAAAADA==#RT:1#TRC:100#RTD:NrCNpn14PWTcji51F4ccBWJlYm5geGZqaHBtZWBgYHVmdHVqbnBvamJtAA==#ISV:2#IEO:65551#QCF:1#FPC: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'.freeze
12
+ CONTINUATION_HEADER_2 = '+RID:~lmJ4ALSekwrtbwAAAAAADA==#RT:2#TRC:200#RTD:NrCNpn14PWTcji51F4ccBWJ2dXBuYnVqZGBxdmNtanRpam9oYGJvZWB2b3F2Y21qdGlqb2hgNDU0ZTJmNgA=#ISV:2#IEO:65551#QCF:1#FPC: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'.freeze
13
+ CONTINUATION_HEADER_3 = '+RID:~lmJ4ALSekwpBxQAAAAAADA==#RT:3#TRC:300#RTD:NrCNpn14PWTcji51F4ccBWJlYm5geGZqaHBtZWBgYHVmdHVqbnBvamJtAA==#ISV:2#IEO:65551#QCF:1#FPC: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'.freeze
14
+
15
+ class << self
16
+ def get_response(query, url, headers)
17
+ @query = query
18
+ if IS_SECURE && !(
19
+ headers['Authorization'] == "Bearer #{query.secure_key}" ||
20
+ headers['Authorization'] == "Bearer #{query.preview_key}"
21
+ )
22
+ return respond_401
23
+ end
24
+
25
+ url =
26
+ if @query.should_preview
27
+ url["https://preview-deliver.kontent.ai/#{query.project_id}".length...url.length]
28
+ else
29
+ url["https://deliver.kontent.ai/#{query.project_id}".length...url.length]
30
+ end
31
+
32
+ return respond_429 if @query.code_name == '429'
33
+
34
+ qs = url.contains('?') ? url.split('?')[1] : nil
35
+
36
+ return respond_feed if query.query_type.eql? Kontent::Ai::Delivery::QUERY_TYPE_ITEMS_FEED
37
+
38
+ return respond_filtering qs unless qs.nil? # e.g. /items/about_us?skip=0&limit=5
39
+
40
+ respond_generic url # Didn't match other clauses, so response should be located in corresponding filepath
41
+ end
42
+
43
+ def respond_generic(url)
44
+ path = Pathname.new(File.dirname(__FILE__) + "/generic#{url}.json")
45
+ OpenStruct.new(
46
+ headers: '',
47
+ body: path.read
48
+ )
49
+ end
50
+
51
+ def respond_feed
52
+ if @query.continuation_exists?
53
+ if @query.continuation_token.include? '#RT:1#'
54
+ headers = {Kontent::Ai::Delivery::DeliveryQuery::HEADER_CONTINUATION => CONTINUATION_HEADER_2}
55
+ path = Pathname.new(File.dirname(__FILE__) + '/items_feed/articles_feed_2.json')
56
+ else
57
+ headers = ''
58
+ path = Pathname.new(File.dirname(__FILE__) + '/items_feed/articles_feed_3.json')
59
+ end
60
+ else
61
+ headers = {Kontent::Ai::Delivery::DeliveryQuery::HEADER_CONTINUATION => CONTINUATION_HEADER_1}
62
+ path = Pathname.new(File.dirname(__FILE__) + '/items_feed/articles_feed_1.json')
63
+ end
64
+
65
+ OpenStruct.new(
66
+ headers: headers,
67
+ body: path.read
68
+ )
69
+ end
70
+
71
+ def respond_filtering(query)
72
+ path =
73
+ case CGI.unescape query
74
+ when 'includeTotalCount=1'
75
+ Pathname.new(File.dirname(__FILE__) + '/filtering/items_with_count.json')
76
+ when 'skip=0&limit=5'
77
+ Pathname.new(File.dirname(__FILE__) + '/filtering/pagination.json')
78
+ end
79
+ OpenStruct.new(
80
+ headers: '',
81
+ body: path.read
82
+ )
83
+ end
84
+
85
+ def respond_429
86
+ path = Pathname.new(File.dirname(__FILE__) + '/429.json')
87
+ Kontent::Ai::Delivery::Responses::ResponseBase.new 429, '', '', path.read if path.exist?
88
+ end
89
+
90
+ def respond_401
91
+ path = Pathname.new(File.dirname(__FILE__) + '/401.json')
92
+ Kontent::Ai::Delivery::Responses::ResponseBase.new 401, '', '', path.read if path.exist?
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end