wcc-media-client 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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +12 -0
- data/Gemfile +6 -0
- data/README.md +0 -0
- data/lib/rest_client.rb +81 -0
- data/lib/rest_client/api_error.rb +24 -0
- data/lib/rest_client/http_adapter.rb +24 -0
- data/lib/rest_client/response.rb +133 -0
- data/lib/rest_client/typhoeus_adapter.rb +44 -0
- data/lib/wcc/media/client.rb +143 -0
- data/lib/wcc/media/client/response.rb +29 -0
- data/lib/wcc/media/client/version.rb +9 -0
- data/lib/wcc/media/message.rb +60 -0
- data/lib/wcc/media/series.rb +36 -0
- data/lib/wcc/media/speaker.rb +25 -0
- data/lib/wcc/media/tag.rb +24 -0
- data/rakefile +3 -0
- data/wcc-media-client.gemspec +35 -0
- metadata +180 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c9d5ecd3de06add389d54a003a565a53f7612f0
|
4
|
+
data.tar.gz: 46b835cc5764ec42b9a6015b7d76bff810dbd9f9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 274b82199adba84eae9bb1159f588c31abc97d2afdca7f2975414aaf4b9752cf6d7f0308a14f4aaee459fdae94ed9b61bd23c8299ae580ebfe79566e0ce73a0d
|
7
|
+
data.tar.gz: 8f8afe9e13f987edea256c6cb5fcb11d18051c4b62de7104b0172186e1213a74b9c159660ed56080d884491fe0e742fc909c24799c559c59205cb153ed86d5e9
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/.rubocop.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
File without changes
|
data/lib/rest_client.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'rest_client/response'
|
4
|
+
|
5
|
+
class RestClient
|
6
|
+
attr_reader :api_url
|
7
|
+
|
8
|
+
def initialize(api_url:, headers: nil, **options)
|
9
|
+
# normalizes a URL to have a slash on the end
|
10
|
+
@api_url = api_url.gsub(/\/+$/, '') + '/'
|
11
|
+
|
12
|
+
@adapter = RestClient.load_adapter(options[:adapter])
|
13
|
+
|
14
|
+
@options = options
|
15
|
+
@query_defaults = {}
|
16
|
+
@headers = {
|
17
|
+
'Accept' => 'application/json',
|
18
|
+
}.merge(headers || {}).freeze
|
19
|
+
@response_class = options[:response_class] || DefaultResponse
|
20
|
+
end
|
21
|
+
|
22
|
+
# performs an HTTP GET request to the specified path within the configured
|
23
|
+
# space and environment. Query parameters are merged with the defaults and
|
24
|
+
# appended to the request.
|
25
|
+
def get(path, query = {})
|
26
|
+
url = URI.join(@api_url, path)
|
27
|
+
|
28
|
+
@response_class.new(self,
|
29
|
+
{ url: url, query: query },
|
30
|
+
get_http(url, query))
|
31
|
+
end
|
32
|
+
|
33
|
+
ADAPTERS = {
|
34
|
+
http: ['http', '> 1.0', '< 3.0'],
|
35
|
+
typhoeus: ['typhoeus', '~> 1.0'],
|
36
|
+
}.freeze
|
37
|
+
|
38
|
+
# This method is long due to the case statement,
|
39
|
+
# not really a better way to do it
|
40
|
+
def self.load_adapter(adapter)
|
41
|
+
case adapter
|
42
|
+
when nil
|
43
|
+
ADAPTERS.each do |a, spec|
|
44
|
+
begin
|
45
|
+
gem(*spec)
|
46
|
+
return load_adapter(a)
|
47
|
+
rescue Gem::LoadError
|
48
|
+
next
|
49
|
+
end
|
50
|
+
end
|
51
|
+
raise ArgumentError, 'Unable to load adapter! Please install one of '\
|
52
|
+
"#{ADAPTERS.values.map(&:join).join(',')}"
|
53
|
+
when :http
|
54
|
+
require_relative 'rest_client/http_adapter'
|
55
|
+
HttpAdapter.new
|
56
|
+
when :typhoeus
|
57
|
+
require_relative 'rest_client/typhoeus_adapter'
|
58
|
+
TyphoeusAdapter.new
|
59
|
+
else
|
60
|
+
unless adapter.respond_to?(:call)
|
61
|
+
raise ArgumentError, "Adapter #{adapter} is not invokeable! Please "\
|
62
|
+
"pass a proc or use one of #{ADAPTERS.keys}"
|
63
|
+
end
|
64
|
+
adapter
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def get_http(url, query, headers = {}, proxy = {})
|
71
|
+
headers = @headers.merge(headers || {})
|
72
|
+
|
73
|
+
q = @query_defaults.dup
|
74
|
+
q = q.merge(query) if query
|
75
|
+
|
76
|
+
resp = @adapter.call(url, q, headers, proxy)
|
77
|
+
|
78
|
+
resp = get_http(resp.headers['location'], nil, headers, proxy) if [301, 302, 307].include?(resp.code) && !@options[:no_follow_redirects]
|
79
|
+
resp
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class RestClient
|
4
|
+
class ApiError < StandardError
|
5
|
+
attr_reader :response
|
6
|
+
|
7
|
+
def self.[](code)
|
8
|
+
case code
|
9
|
+
when 404
|
10
|
+
NotFoundError
|
11
|
+
else
|
12
|
+
ApiError
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(response)
|
17
|
+
@response = response
|
18
|
+
super(response.error_message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class NotFoundError < ApiError
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
gem 'http'
|
4
|
+
require 'http'
|
5
|
+
|
6
|
+
class HttpAdapter
|
7
|
+
def call(url, query, headers = {}, proxy = {})
|
8
|
+
if proxy[:host]
|
9
|
+
HTTP[headers].via(proxy[:host], proxy[:port], proxy[:username], proxy[:password])
|
10
|
+
.get(url, params: query)
|
11
|
+
else
|
12
|
+
HTTP[headers].get(url, params: query)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def post(url, body, headers = {}, proxy = {})
|
17
|
+
if proxy[:host]
|
18
|
+
HTTP[headers].via(proxy[:host], proxy[:port], proxy[:username], proxy[:password])
|
19
|
+
.post(url, json: body)
|
20
|
+
else
|
21
|
+
HTTP[headers].post(url, json: body)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
require_relative 'api_error'
|
5
|
+
|
6
|
+
class RestClient
|
7
|
+
class AbstractResponse
|
8
|
+
extend ::Forwardable
|
9
|
+
|
10
|
+
attr_reader :raw_response
|
11
|
+
attr_reader :raw_body
|
12
|
+
attr_reader :client
|
13
|
+
attr_reader :request
|
14
|
+
|
15
|
+
def_delegators :raw_response, :code, :headers
|
16
|
+
|
17
|
+
def body
|
18
|
+
@body ||= JSON.parse(raw_body)
|
19
|
+
end
|
20
|
+
alias_method :to_json, :body
|
21
|
+
|
22
|
+
def initialize(client, request, raw_response)
|
23
|
+
@client = client
|
24
|
+
@request = request
|
25
|
+
@raw_response = raw_response
|
26
|
+
@raw_body = raw_response.body.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def skip
|
30
|
+
throw new NotImplementedError, 'Please implement "skip" parsing in response class'
|
31
|
+
end
|
32
|
+
|
33
|
+
def count
|
34
|
+
throw new NotImplementedError, 'Please implement "count" parsing in response class'
|
35
|
+
end
|
36
|
+
|
37
|
+
def collection_response?
|
38
|
+
page_items.nil? ? false : true
|
39
|
+
end
|
40
|
+
|
41
|
+
def page_items
|
42
|
+
throw new NotImplementedError, 'Please implement "page_items" parsing in response class'
|
43
|
+
end
|
44
|
+
|
45
|
+
def error_message
|
46
|
+
parsed_message =
|
47
|
+
begin
|
48
|
+
body.dig('error', 'message') || body.dig('message')
|
49
|
+
rescue JSON::ParserError
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
parsed_message || "#{code}: #{raw_response.body}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def next_page?
|
56
|
+
return false unless collection_response?
|
57
|
+
|
58
|
+
page_items.length + skip < count
|
59
|
+
end
|
60
|
+
|
61
|
+
def next_page
|
62
|
+
return unless next_page?
|
63
|
+
|
64
|
+
@next_page ||= @client.get(
|
65
|
+
@request[:url],
|
66
|
+
(@request[:query] || {}).merge(next_page_query)
|
67
|
+
)
|
68
|
+
@next_page.assert_ok!
|
69
|
+
end
|
70
|
+
|
71
|
+
def assert_ok!
|
72
|
+
return self if code >= 200 && code < 300
|
73
|
+
|
74
|
+
raise ApiError[code], self
|
75
|
+
end
|
76
|
+
|
77
|
+
# This method has a bit of complexity that is better kept in one location
|
78
|
+
def each_page(&block)
|
79
|
+
raise ArgumentError, 'Not a collection response' unless collection_response?
|
80
|
+
|
81
|
+
ret =
|
82
|
+
Enumerator.new do |y|
|
83
|
+
y << self
|
84
|
+
|
85
|
+
if next_page?
|
86
|
+
next_page.each_page.each do |page|
|
87
|
+
y << page
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
if block_given?
|
93
|
+
ret.map(&block)
|
94
|
+
else
|
95
|
+
ret.lazy
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def items
|
100
|
+
return unless collection_response?
|
101
|
+
|
102
|
+
each_page.flat_map(&:page_items)
|
103
|
+
end
|
104
|
+
|
105
|
+
def first
|
106
|
+
raise ArgumentError, 'Not a collection response' unless collection_response?
|
107
|
+
|
108
|
+
page_items.first
|
109
|
+
end
|
110
|
+
|
111
|
+
def next_page_query
|
112
|
+
return unless collection_response?
|
113
|
+
|
114
|
+
{
|
115
|
+
skip: page_items.length + skip,
|
116
|
+
}
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class DefaultResponse < AbstractResponse
|
121
|
+
def skip
|
122
|
+
body['skip']
|
123
|
+
end
|
124
|
+
|
125
|
+
def count
|
126
|
+
body['total']
|
127
|
+
end
|
128
|
+
|
129
|
+
def page_items
|
130
|
+
body['items']
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
gem 'typhoeus'
|
5
|
+
require 'typhoeus'
|
6
|
+
|
7
|
+
class RestClient
|
8
|
+
class TyphoeusAdapter
|
9
|
+
def call(url, query, headers = {}, proxy = {})
|
10
|
+
raise NotImplementedError, 'Proxying Not Yet Implemented' if proxy[:host]
|
11
|
+
|
12
|
+
TyphoeusAdapter::Response.new(
|
13
|
+
Typhoeus.get(
|
14
|
+
url,
|
15
|
+
params: query,
|
16
|
+
headers: headers
|
17
|
+
)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def post(url, body, headers = {}, proxy = {})
|
22
|
+
raise NotImplementedError, 'Proxying Not Yet Implemented' if proxy[:host]
|
23
|
+
|
24
|
+
TyphoeusAdapter::Response.new(
|
25
|
+
Typhoeus.post(
|
26
|
+
url,
|
27
|
+
body: body.to_json,
|
28
|
+
headers: headers
|
29
|
+
)
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
Response =
|
34
|
+
Struct.new(:raw) do
|
35
|
+
extend Forwardable
|
36
|
+
|
37
|
+
def_delegators :raw, :body, :to_s, :code, :headers
|
38
|
+
|
39
|
+
def status
|
40
|
+
raw.code
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require_relative '../../rest_client'
|
2
|
+
require_relative 'message'
|
3
|
+
require_relative 'series'
|
4
|
+
require_relative 'speaker'
|
5
|
+
require_relative 'tag'
|
6
|
+
require_relative 'client/response'
|
7
|
+
|
8
|
+
module WCC
|
9
|
+
module Media
|
10
|
+
class Client < RestClient
|
11
|
+
PARAMS = %w[
|
12
|
+
limit
|
13
|
+
offset
|
14
|
+
order_by
|
15
|
+
sort
|
16
|
+
target
|
17
|
+
].freeze
|
18
|
+
|
19
|
+
def initialize(**options)
|
20
|
+
options = {
|
21
|
+
api_url: 'https://media.watermark.org/api/v1/',
|
22
|
+
response_class: Response
|
23
|
+
}.merge!(options)
|
24
|
+
super(**options)
|
25
|
+
end
|
26
|
+
|
27
|
+
MESSAGES_FILTERS = %w[
|
28
|
+
on_or_after_date
|
29
|
+
on_or_before_date
|
30
|
+
tag_id
|
31
|
+
speaker_id
|
32
|
+
scripture_book_id
|
33
|
+
series_id
|
34
|
+
title_like
|
35
|
+
legacy_id
|
36
|
+
].freeze
|
37
|
+
|
38
|
+
def messages_list(**filters)
|
39
|
+
query = extract_params(filters)
|
40
|
+
query = query.merge!(apply_filters(filters, MESSAGES_FILTERS))
|
41
|
+
resp = get('messages', query)
|
42
|
+
resp.assert_ok!
|
43
|
+
resp.items.map { |m| WCC::Media::Message.new(m) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def message(id)
|
47
|
+
resp = get("messages/#{id}")
|
48
|
+
resp.assert_ok!
|
49
|
+
WCC::Media::Message.new(resp.body['message'])
|
50
|
+
end
|
51
|
+
|
52
|
+
SERIES_FILTERS = %w[
|
53
|
+
begin_on_or_before_date
|
54
|
+
begin_on_or_after_date
|
55
|
+
end_on_or_before_date
|
56
|
+
end_on_or_after_date
|
57
|
+
tag_id
|
58
|
+
speaker_id
|
59
|
+
scripture_book_id
|
60
|
+
title_like
|
61
|
+
legacy_id
|
62
|
+
]
|
63
|
+
|
64
|
+
def series_list(**filters)
|
65
|
+
query = extract_params(filters)
|
66
|
+
query = query.merge!(apply_filters(filters, SERIES_FILTERS))
|
67
|
+
resp = get('series', query)
|
68
|
+
resp.assert_ok!
|
69
|
+
resp.items.map { |s| WCC::Media::Series.new(s) }
|
70
|
+
end
|
71
|
+
|
72
|
+
def series(id)
|
73
|
+
resp = get("series/#{id}")
|
74
|
+
resp.assert_ok!
|
75
|
+
WCC::Media::Series.new(resp.body['series'])
|
76
|
+
end
|
77
|
+
|
78
|
+
SPEAKERS_FILTERS = %w[
|
79
|
+
featured
|
80
|
+
name_like
|
81
|
+
tag_id
|
82
|
+
]
|
83
|
+
|
84
|
+
def speakers_list(**filters)
|
85
|
+
query = extract_params(filters)
|
86
|
+
query = query.merge!(apply_filters(filters, SPEAKERS_FILTERS))
|
87
|
+
resp = get('speakers', query)
|
88
|
+
resp.assert_ok!
|
89
|
+
resp.items.map { |s| WCC::Media::Speaker.new(s) }
|
90
|
+
end
|
91
|
+
|
92
|
+
def speaker(id)
|
93
|
+
resp = get("speakers/#{id}")
|
94
|
+
resp.assert_ok!
|
95
|
+
WCC::Media::Speaker.new(resp.body['speaker'])
|
96
|
+
end
|
97
|
+
|
98
|
+
TAGS_FILTERS = %w[
|
99
|
+
name_like
|
100
|
+
]
|
101
|
+
|
102
|
+
def tags_list(**filters)
|
103
|
+
query = extract_params(filters)
|
104
|
+
query = query.merge!(apply_filters(filters, TAGS_FILTERS))
|
105
|
+
resp = get('tags', query)
|
106
|
+
resp.assert_ok!
|
107
|
+
resp.items.map { |s| WCC::Media::Tag.new(s) }
|
108
|
+
end
|
109
|
+
|
110
|
+
def tag(id)
|
111
|
+
resp = get("tags/#{id}")
|
112
|
+
resp.assert_ok!
|
113
|
+
WCC::Media::Tag.new(resp.body['tag'])
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def extract_params(filters)
|
119
|
+
filters.each_with_object({}) do |(k, _v), h|
|
120
|
+
k_s = k.to_s
|
121
|
+
h[k_s] = filters.delete(k) if PARAMS.include?(k_s)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def apply_filters(filters, expected_filters)
|
126
|
+
defaults = default_filters(expected_filters) || {}
|
127
|
+
filters.each_with_object(defaults) do |(k, v), h|
|
128
|
+
k = k.to_s
|
129
|
+
raise ArgumentError, "Unknown filter '#{k}'" unless expected_filters.include?(k)
|
130
|
+
|
131
|
+
h["filter[#{k}]"] = v
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def default_filters(expected_filters)
|
136
|
+
@options[:default_filters]&.each_with_object({}) do |(k, v), h|
|
137
|
+
k = k.to_s
|
138
|
+
h["filter[#{k}]"] = v if expected_filters.include?(k)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module WCC
|
2
|
+
module Media
|
3
|
+
class Client < RestClient
|
4
|
+
class Response < RestClient::AbstractResponse
|
5
|
+
def skip
|
6
|
+
body.dig('pagination', 'offset')
|
7
|
+
end
|
8
|
+
|
9
|
+
def count
|
10
|
+
body.dig('pagination', 'total')
|
11
|
+
end
|
12
|
+
|
13
|
+
def collection_response?
|
14
|
+
body.key?('pagination')
|
15
|
+
end
|
16
|
+
|
17
|
+
def page_items
|
18
|
+
body['messages'] || body['series'] || body['speakers'] || body['tags']
|
19
|
+
end
|
20
|
+
|
21
|
+
def next_page_query
|
22
|
+
{
|
23
|
+
offset: page_items.length + skip,
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module WCC
|
2
|
+
module Media
|
3
|
+
Message =
|
4
|
+
Struct.new(:raw) do
|
5
|
+
def id
|
6
|
+
raw['id']&.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def legacy_id
|
10
|
+
raw['legacy_id']&.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
%w[
|
14
|
+
date
|
15
|
+
title
|
16
|
+
description
|
17
|
+
series_position
|
18
|
+
].each do |att|
|
19
|
+
define_method att do
|
20
|
+
raw[att]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def speakers
|
25
|
+
(raw['speakers'] || []).map { |val| Speaker.new(val) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def tags
|
29
|
+
(raw['tags'] || []).map { |val| Tag.new(val) }
|
30
|
+
end
|
31
|
+
|
32
|
+
%w[
|
33
|
+
scripture_references
|
34
|
+
downloads
|
35
|
+
].each do |att|
|
36
|
+
define_method att do
|
37
|
+
(raw[att] || []).map { |val| OpenStruct.new(val) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def series
|
42
|
+
Series.new(raw['series']) if raw['series']
|
43
|
+
end
|
44
|
+
|
45
|
+
%w[
|
46
|
+
embeds
|
47
|
+
assets
|
48
|
+
images
|
49
|
+
external_urls
|
50
|
+
transcript
|
51
|
+
].each do |att|
|
52
|
+
define_method att do
|
53
|
+
OpenStruct.new(raw[att]) if raw[att]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
undef raw=
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module WCC
|
2
|
+
module Media
|
3
|
+
Series =
|
4
|
+
Struct.new(:raw) do
|
5
|
+
def id
|
6
|
+
raw['id']&.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def legacy_id
|
10
|
+
raw['legacy_id']&.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
%w[
|
14
|
+
title
|
15
|
+
subtitle
|
16
|
+
summary
|
17
|
+
date_range
|
18
|
+
messages_count
|
19
|
+
].each do |att|
|
20
|
+
define_method att do
|
21
|
+
raw[att]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
%w[
|
26
|
+
images
|
27
|
+
].each do |att|
|
28
|
+
define_method att do
|
29
|
+
OpenStruct.new(raw[att]) if raw[att]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
undef raw=
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module WCC
|
2
|
+
module Media
|
3
|
+
Speaker =
|
4
|
+
Struct.new(:raw) do
|
5
|
+
def id
|
6
|
+
raw['id']&.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def legacy_id
|
10
|
+
raw['legacy_id']&.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
%w[
|
14
|
+
featured
|
15
|
+
name
|
16
|
+
].each do |att|
|
17
|
+
define_method att do
|
18
|
+
raw[att]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
undef raw=
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module WCC
|
2
|
+
module Media
|
3
|
+
Tag =
|
4
|
+
Struct.new(:raw) do
|
5
|
+
def id
|
6
|
+
raw['id']&.to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
def legacy_id
|
10
|
+
raw['legacy_id']&.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
%w[
|
14
|
+
name
|
15
|
+
].each do |att|
|
16
|
+
define_method att do
|
17
|
+
raw[att]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
undef raw=
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'wcc/media/client/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'wcc-media-client'
|
9
|
+
spec.version = WCC::Media::Client::VERSION
|
10
|
+
spec.authors = ['Watermark Dev']
|
11
|
+
spec.email = ['dev@watermark.org']
|
12
|
+
|
13
|
+
spec.summary = File.readlines(File.expand_path('README.md', __dir__)).join
|
14
|
+
spec.description = 'REST Client for accessing the WCC Media library'
|
15
|
+
spec.homepage = 'https://github.com/watermarkchurch/media/wcc-media-client'
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
spec.required_ruby_version = '>= 2.3'
|
19
|
+
|
20
|
+
spec.files =
|
21
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
f.match(%r{^(test|spec|features)/})
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.require_paths = ['lib']
|
26
|
+
|
27
|
+
spec.add_development_dependency 'byebug'
|
28
|
+
spec.add_development_dependency 'http', '> 1.0', '< 3.0'
|
29
|
+
spec.add_development_dependency 'httplog', '~> 1.0'
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
31
|
+
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.3.0'
|
32
|
+
spec.add_development_dependency 'typhoeus', '~> 1.3'
|
33
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
34
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wcc-media-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Watermark Dev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: byebug
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: http
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '3.0'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: httplog
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '3.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec_junit_formatter
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.3.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.3.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: typhoeus
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.3'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.3'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: webmock
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '3.0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '3.0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: rake
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '12.3'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '12.3'
|
131
|
+
description: REST Client for accessing the WCC Media library
|
132
|
+
email:
|
133
|
+
- dev@watermark.org
|
134
|
+
executables: []
|
135
|
+
extensions: []
|
136
|
+
extra_rdoc_files: []
|
137
|
+
files:
|
138
|
+
- ".gitignore"
|
139
|
+
- ".rubocop.yml"
|
140
|
+
- Gemfile
|
141
|
+
- README.md
|
142
|
+
- lib/rest_client.rb
|
143
|
+
- lib/rest_client/api_error.rb
|
144
|
+
- lib/rest_client/http_adapter.rb
|
145
|
+
- lib/rest_client/response.rb
|
146
|
+
- lib/rest_client/typhoeus_adapter.rb
|
147
|
+
- lib/wcc/media/client.rb
|
148
|
+
- lib/wcc/media/client/response.rb
|
149
|
+
- lib/wcc/media/client/version.rb
|
150
|
+
- lib/wcc/media/message.rb
|
151
|
+
- lib/wcc/media/series.rb
|
152
|
+
- lib/wcc/media/speaker.rb
|
153
|
+
- lib/wcc/media/tag.rb
|
154
|
+
- rakefile
|
155
|
+
- wcc-media-client.gemspec
|
156
|
+
homepage: https://github.com/watermarkchurch/media/wcc-media-client
|
157
|
+
licenses:
|
158
|
+
- MIT
|
159
|
+
metadata: {}
|
160
|
+
post_install_message:
|
161
|
+
rdoc_options: []
|
162
|
+
require_paths:
|
163
|
+
- lib
|
164
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '2.3'
|
169
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
requirements: []
|
175
|
+
rubyforge_project:
|
176
|
+
rubygems_version: 2.5.2
|
177
|
+
signing_key:
|
178
|
+
specification_version: 4
|
179
|
+
summary: ''
|
180
|
+
test_files: []
|