trailer_vote-api 0.8.4 → 0.9.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.
- checksums.yaml +5 -5
- data/.gitignore +13 -13
- data/.rubocop.yml +29 -29
- data/CHANGELOG.md +56 -56
- data/Gemfile +6 -6
- data/Gemfile.lock +10 -11
- data/README.md +188 -188
- data/Rakefile +12 -12
- data/bin/console +15 -15
- data/bin/setup +8 -8
- data/lib/trailer_vote/api.rb +43 -43
- data/lib/trailer_vote/api/autoload.rb +24 -22
- data/lib/trailer_vote/api/composable/common.rb +91 -91
- data/lib/trailer_vote/api/composable/get.rb +66 -66
- data/lib/trailer_vote/api/configuration.rb +71 -71
- data/lib/trailer_vote/api/errors.rb +115 -115
- data/lib/trailer_vote/api/fallback_content_types.rb +50 -50
- data/lib/trailer_vote/api/issue.rb +31 -31
- data/lib/trailer_vote/api/issue/create.rb +72 -72
- data/lib/trailer_vote/api/issue/find.rb +42 -42
- data/lib/trailer_vote/api/links.rb +54 -54
- data/lib/trailer_vote/api/place.rb +24 -24
- data/lib/trailer_vote/api/place/children.rb +33 -0
- data/lib/trailer_vote/api/place/children/urls.rb +67 -0
- data/lib/trailer_vote/api/place/create.rb +83 -83
- data/lib/trailer_vote/api/place/find.rb +60 -59
- data/lib/trailer_vote/api/product.rb +33 -33
- data/lib/trailer_vote/api/product/create.rb +63 -63
- data/lib/trailer_vote/api/product/find.rb +55 -55
- data/lib/trailer_vote/api/product/image.rb +38 -38
- data/lib/trailer_vote/api/product/image/create.rb +83 -83
- data/lib/trailer_vote/api/product/image/find.rb +54 -54
- data/lib/trailer_vote/api/product/image/urls.rb +66 -66
- data/lib/trailer_vote/api/product/lookup.rb +97 -97
- data/lib/trailer_vote/api/product/place.rb +40 -40
- data/lib/trailer_vote/api/product/place/link.rb +75 -75
- data/lib/trailer_vote/api/product/update.rb +80 -80
- data/lib/trailer_vote/api/product/video.rb +38 -38
- data/lib/trailer_vote/api/product/video/create.rb +80 -80
- data/lib/trailer_vote/api/product/video/find.rb +56 -56
- data/lib/trailer_vote/api/product/video/urls.rb +66 -66
- data/lib/trailer_vote/api/type_registry.rb +99 -99
- data/lib/trailer_vote/api/version.rb +7 -7
- data/trailer_vote-api.gemspec +45 -45
- metadata +7 -6
@@ -1,54 +1,54 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'trailer_vote/api/composable/get'
|
4
|
-
require 'trailer_vote/api/product/image'
|
5
|
-
|
6
|
-
module TrailerVote
|
7
|
-
module Api
|
8
|
-
class Product
|
9
|
-
class Image
|
10
|
-
|
11
|
-
# @param [TrailerVote::Api::Product::Image::Find,
|
12
|
-
# TrailerVote::Api::Product::Image::Create,
|
13
|
-
# TrailerVote::Api::Product::Image::Urls::Traverse,
|
14
|
-
# NilClass] result the found image, or nil
|
15
|
-
# @return [TrailerVote::Api::Product::Image::Find] the api to deal with the found image
|
16
|
-
def find(result: nil)
|
17
|
-
Find.new(configuration: configuration, result: result)
|
18
|
-
end
|
19
|
-
|
20
|
-
class Find
|
21
|
-
include Composable::Get
|
22
|
-
|
23
|
-
SUCCESS = MediaTypes::ProductImage.to_constructable.version(1)
|
24
|
-
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
25
|
-
|
26
|
-
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
27
|
-
|
28
|
-
def initialize(configuration:, result: nil)
|
29
|
-
self.configuration = configuration
|
30
|
-
self.result = result
|
31
|
-
end
|
32
|
-
|
33
|
-
# @return [TrailerVote::Api::Product::Image::Create,
|
34
|
-
# TrailerVote::Api::Product::Image::Urls::Traverse,
|
35
|
-
# NilClass] return the api that yielded this
|
36
|
-
def back
|
37
|
-
backtrack = result
|
38
|
-
backtrack = result.back while backtrack&.is_a?(self.class)
|
39
|
-
backtrack
|
40
|
-
end
|
41
|
-
|
42
|
-
def call(url: nil)
|
43
|
-
return self if ok? || !url
|
44
|
-
branch(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
|
45
|
-
end
|
46
|
-
|
47
|
-
def data
|
48
|
-
to_h[:product_image]
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'trailer_vote/api/composable/get'
|
4
|
+
require 'trailer_vote/api/product/image'
|
5
|
+
|
6
|
+
module TrailerVote
|
7
|
+
module Api
|
8
|
+
class Product
|
9
|
+
class Image
|
10
|
+
|
11
|
+
# @param [TrailerVote::Api::Product::Image::Find,
|
12
|
+
# TrailerVote::Api::Product::Image::Create,
|
13
|
+
# TrailerVote::Api::Product::Image::Urls::Traverse,
|
14
|
+
# NilClass] result the found image, or nil
|
15
|
+
# @return [TrailerVote::Api::Product::Image::Find] the api to deal with the found image
|
16
|
+
def find(result: nil)
|
17
|
+
Find.new(configuration: configuration, result: result)
|
18
|
+
end
|
19
|
+
|
20
|
+
class Find
|
21
|
+
include Composable::Get
|
22
|
+
|
23
|
+
SUCCESS = MediaTypes::ProductImage.to_constructable.version(1)
|
24
|
+
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
25
|
+
|
26
|
+
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
27
|
+
|
28
|
+
def initialize(configuration:, result: nil)
|
29
|
+
self.configuration = configuration
|
30
|
+
self.result = result
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [TrailerVote::Api::Product::Image::Create,
|
34
|
+
# TrailerVote::Api::Product::Image::Urls::Traverse,
|
35
|
+
# NilClass] return the api that yielded this
|
36
|
+
def back
|
37
|
+
backtrack = result
|
38
|
+
backtrack = result.back while backtrack&.is_a?(self.class)
|
39
|
+
backtrack
|
40
|
+
end
|
41
|
+
|
42
|
+
def call(url: nil)
|
43
|
+
return self if ok? || !url
|
44
|
+
branch(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
|
45
|
+
end
|
46
|
+
|
47
|
+
def data
|
48
|
+
to_h[:product_image]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,66 +1,66 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'trailer_vote/api/composable/get'
|
4
|
-
require 'trailer_vote/api/product/image'
|
5
|
-
|
6
|
-
module TrailerVote
|
7
|
-
module Api
|
8
|
-
class Product
|
9
|
-
class Image
|
10
|
-
|
11
|
-
# @return [TrailerVote::Api::Product::Image::Urls] the api to get the image urls for the current product
|
12
|
-
def urls
|
13
|
-
Urls.new(configuration: configuration, product: product)
|
14
|
-
end
|
15
|
-
|
16
|
-
class Urls
|
17
|
-
include Composable::Get
|
18
|
-
|
19
|
-
SUCCESS = MediaTypes::ProductImage.to_constructable.version(1).view('index')
|
20
|
-
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
21
|
-
|
22
|
-
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
23
|
-
|
24
|
-
def initialize(configuration:, product:, result: nil)
|
25
|
-
self.configuration = configuration
|
26
|
-
self.product = product
|
27
|
-
self.result = result
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [TrailerVote::Api::Product::Image] the api to deal with a product's images
|
31
|
-
def back
|
32
|
-
product.image
|
33
|
-
end
|
34
|
-
|
35
|
-
def call(url: resolve_url)
|
36
|
-
return self if ok? || !url
|
37
|
-
guard_network_errors do
|
38
|
-
branch(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def data
|
43
|
-
to_h[:product_images]
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
attr_accessor :product
|
49
|
-
|
50
|
-
def ok?
|
51
|
-
result&.status&.ok?
|
52
|
-
end
|
53
|
-
|
54
|
-
def resolve_url
|
55
|
-
product.links.images
|
56
|
-
end
|
57
|
-
|
58
|
-
def redirect(result)
|
59
|
-
redirect_klazz.new(configuration: configuration, product: product, result: result)
|
60
|
-
.call(url: redirected_url(result))
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'trailer_vote/api/composable/get'
|
4
|
+
require 'trailer_vote/api/product/image'
|
5
|
+
|
6
|
+
module TrailerVote
|
7
|
+
module Api
|
8
|
+
class Product
|
9
|
+
class Image
|
10
|
+
|
11
|
+
# @return [TrailerVote::Api::Product::Image::Urls] the api to get the image urls for the current product
|
12
|
+
def urls
|
13
|
+
Urls.new(configuration: configuration, product: product)
|
14
|
+
end
|
15
|
+
|
16
|
+
class Urls
|
17
|
+
include Composable::Get
|
18
|
+
|
19
|
+
SUCCESS = MediaTypes::ProductImage.to_constructable.version(1).view('index')
|
20
|
+
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
21
|
+
|
22
|
+
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
23
|
+
|
24
|
+
def initialize(configuration:, product:, result: nil)
|
25
|
+
self.configuration = configuration
|
26
|
+
self.product = product
|
27
|
+
self.result = result
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [TrailerVote::Api::Product::Image] the api to deal with a product's images
|
31
|
+
def back
|
32
|
+
product.image
|
33
|
+
end
|
34
|
+
|
35
|
+
def call(url: resolve_url)
|
36
|
+
return self if ok? || !url
|
37
|
+
guard_network_errors do
|
38
|
+
branch(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def data
|
43
|
+
to_h[:product_images]
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
attr_accessor :product
|
49
|
+
|
50
|
+
def ok?
|
51
|
+
result&.status&.ok?
|
52
|
+
end
|
53
|
+
|
54
|
+
def resolve_url
|
55
|
+
product.links.images
|
56
|
+
end
|
57
|
+
|
58
|
+
def redirect(result)
|
59
|
+
redirect_klazz.new(configuration: configuration, product: product, result: result)
|
60
|
+
.call(url: redirected_url(result))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,97 +1,97 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'trailer_vote/api/composable/common'
|
4
|
-
|
5
|
-
require 'trailer_vote/api/product'
|
6
|
-
require 'trailer_vote/api/product/find'
|
7
|
-
|
8
|
-
module TrailerVote
|
9
|
-
module Api
|
10
|
-
|
11
|
-
class Configuration
|
12
|
-
# @return [TrailerVote::Api::Product::Lookup] api to deal with looking up a product
|
13
|
-
def product_lookup
|
14
|
-
product.lookup
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class Product
|
19
|
-
|
20
|
-
# @return [TrailerVote::Api::Product::Lookup] api to deal with looking up a product
|
21
|
-
def lookup
|
22
|
-
Lookup.new(configuration: configuration)
|
23
|
-
end
|
24
|
-
|
25
|
-
##
|
26
|
-
# Looks up a product by a set of authority and identifiers in +lookups+
|
27
|
-
#
|
28
|
-
# @example lookup a product by imdb or tmdb authority
|
29
|
-
#
|
30
|
-
# lookups = [
|
31
|
-
# { authority: 'imdb', identifier: 'tt1825683'},
|
32
|
-
# { authority: 'tmdb', identifier: '284054' }
|
33
|
-
# ]
|
34
|
-
# result = TrailerVote::Api.configure(...).product.lookup.call(data: lookups)
|
35
|
-
# result.product
|
36
|
-
# # => { "title": "" }
|
37
|
-
#
|
38
|
-
# @example try to lookup multiple products at the same time
|
39
|
-
#
|
40
|
-
# lookups = [
|
41
|
-
# { authority: 'imdb', identifier: 'tt1825683'},
|
42
|
-
# { authority: 'isbn', identifier: '978-1-59448-194-9' }
|
43
|
-
# ]
|
44
|
-
# result = TrailerVote::Api.configure(...).product.lookup.call(data: lookups)
|
45
|
-
# result.errors
|
46
|
-
# # => [{ "message": "Found multiple products for the given identifiers, only one result ..." }]
|
47
|
-
#
|
48
|
-
class Lookup
|
49
|
-
include Composable::Common
|
50
|
-
|
51
|
-
CONTENT = MediaTypes::ProductLookup.to_constructable.version(1)
|
52
|
-
SUCCESS = MediaTypes::Product.to_constructable.version(2)
|
53
|
-
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
54
|
-
|
55
|
-
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
56
|
-
|
57
|
-
def initialize(configuration:)
|
58
|
-
self.configuration = configuration
|
59
|
-
end
|
60
|
-
|
61
|
-
# @return [TrailerVote::Api::Product] api to deal with products
|
62
|
-
def back
|
63
|
-
configuration.product
|
64
|
-
end
|
65
|
-
|
66
|
-
def call(data:, url: resolve_url)
|
67
|
-
body = encode(data)
|
68
|
-
guard_network_errors do
|
69
|
-
branch(
|
70
|
-
resolve_client.headers(
|
71
|
-
Headers::ACCEPT => ACCEPT,
|
72
|
-
Headers::CONTENT_TYPE => "#{CONTENT}; charset=#{body.encoding.name}"
|
73
|
-
).post(url, body: body),
|
74
|
-
data: data
|
75
|
-
)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def resolve_url
|
82
|
-
configuration.links.product_lookup
|
83
|
-
end
|
84
|
-
|
85
|
-
def encode(data)
|
86
|
-
TrailerVote::Api.encode(CONTENT, product_identifiers: data)
|
87
|
-
end
|
88
|
-
|
89
|
-
def redirect_klazz
|
90
|
-
Find
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
TrailerVote::MediaTypes::ProductLookup.register
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'trailer_vote/api/composable/common'
|
4
|
+
|
5
|
+
require 'trailer_vote/api/product'
|
6
|
+
require 'trailer_vote/api/product/find'
|
7
|
+
|
8
|
+
module TrailerVote
|
9
|
+
module Api
|
10
|
+
|
11
|
+
class Configuration
|
12
|
+
# @return [TrailerVote::Api::Product::Lookup] api to deal with looking up a product
|
13
|
+
def product_lookup
|
14
|
+
product.lookup
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Product
|
19
|
+
|
20
|
+
# @return [TrailerVote::Api::Product::Lookup] api to deal with looking up a product
|
21
|
+
def lookup
|
22
|
+
Lookup.new(configuration: configuration)
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Looks up a product by a set of authority and identifiers in +lookups+
|
27
|
+
#
|
28
|
+
# @example lookup a product by imdb or tmdb authority
|
29
|
+
#
|
30
|
+
# lookups = [
|
31
|
+
# { authority: 'imdb', identifier: 'tt1825683'},
|
32
|
+
# { authority: 'tmdb', identifier: '284054' }
|
33
|
+
# ]
|
34
|
+
# result = TrailerVote::Api.configure(...).product.lookup.call(data: lookups)
|
35
|
+
# result.product
|
36
|
+
# # => { "title": "" }
|
37
|
+
#
|
38
|
+
# @example try to lookup multiple products at the same time
|
39
|
+
#
|
40
|
+
# lookups = [
|
41
|
+
# { authority: 'imdb', identifier: 'tt1825683'},
|
42
|
+
# { authority: 'isbn', identifier: '978-1-59448-194-9' }
|
43
|
+
# ]
|
44
|
+
# result = TrailerVote::Api.configure(...).product.lookup.call(data: lookups)
|
45
|
+
# result.errors
|
46
|
+
# # => [{ "message": "Found multiple products for the given identifiers, only one result ..." }]
|
47
|
+
#
|
48
|
+
class Lookup
|
49
|
+
include Composable::Common
|
50
|
+
|
51
|
+
CONTENT = MediaTypes::ProductLookup.to_constructable.version(1)
|
52
|
+
SUCCESS = MediaTypes::Product.to_constructable.version(2)
|
53
|
+
FAILURE = MediaTypes::Errors.to_constructable.version(1)
|
54
|
+
|
55
|
+
ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
|
56
|
+
|
57
|
+
def initialize(configuration:)
|
58
|
+
self.configuration = configuration
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [TrailerVote::Api::Product] api to deal with products
|
62
|
+
def back
|
63
|
+
configuration.product
|
64
|
+
end
|
65
|
+
|
66
|
+
def call(data:, url: resolve_url)
|
67
|
+
body = encode(data)
|
68
|
+
guard_network_errors do
|
69
|
+
branch(
|
70
|
+
resolve_client.headers(
|
71
|
+
Headers::ACCEPT => ACCEPT,
|
72
|
+
Headers::CONTENT_TYPE => "#{CONTENT}; charset=#{body.encoding.name}"
|
73
|
+
).post(url, body: body),
|
74
|
+
data: data
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def resolve_url
|
82
|
+
configuration.links.product_lookup
|
83
|
+
end
|
84
|
+
|
85
|
+
def encode(data)
|
86
|
+
TrailerVote::Api.encode(CONTENT, product_identifiers: data)
|
87
|
+
end
|
88
|
+
|
89
|
+
def redirect_klazz
|
90
|
+
Find
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
TrailerVote::MediaTypes::ProductLookup.register
|
@@ -1,40 +1,40 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'trailer_vote/media_types'
|
4
|
-
|
5
|
-
require 'trailer_vote/api/product'
|
6
|
-
require 'trailer_vote/api/product/find'
|
7
|
-
|
8
|
-
module TrailerVote
|
9
|
-
module Api
|
10
|
-
class Product
|
11
|
-
class Find
|
12
|
-
# @return [TrailerVote::Api::Place] api to deal with a product's places
|
13
|
-
def place
|
14
|
-
Place.new(configuration: configuration, product: self)
|
15
|
-
end
|
16
|
-
|
17
|
-
alias product_place place
|
18
|
-
alias places place
|
19
|
-
end
|
20
|
-
|
21
|
-
class Place
|
22
|
-
def initialize(configuration:, product: nil)
|
23
|
-
self.configuration = configuration
|
24
|
-
self.product = product
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [TrailerVote::Api::Place::Find] api to deal with a found product
|
28
|
-
def back
|
29
|
-
product
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
attr_accessor :configuration, :product
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
TrailerVote::MediaTypes::ProductPlaceLink.register
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'trailer_vote/media_types'
|
4
|
+
|
5
|
+
require 'trailer_vote/api/product'
|
6
|
+
require 'trailer_vote/api/product/find'
|
7
|
+
|
8
|
+
module TrailerVote
|
9
|
+
module Api
|
10
|
+
class Product
|
11
|
+
class Find
|
12
|
+
# @return [TrailerVote::Api::Place] api to deal with a product's places
|
13
|
+
def place
|
14
|
+
Place.new(configuration: configuration, product: self)
|
15
|
+
end
|
16
|
+
|
17
|
+
alias product_place place
|
18
|
+
alias places place
|
19
|
+
end
|
20
|
+
|
21
|
+
class Place
|
22
|
+
def initialize(configuration:, product: nil)
|
23
|
+
self.configuration = configuration
|
24
|
+
self.product = product
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [TrailerVote::Api::Place::Find] api to deal with a found product
|
28
|
+
def back
|
29
|
+
product
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_accessor :configuration, :product
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
TrailerVote::MediaTypes::ProductPlaceLink.register
|