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 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
@@ -0,0 +1,12 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ Metrics/BlockLength:
4
+ Exclude:
5
+ - 'spec/**/*'
6
+
7
+ Style/ClassAndModuleChildren:
8
+ Enabled: false
9
+
10
+ Style/MultilineBlockChain:
11
+ Exclude:
12
+ - 'spec/**/*'
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in wcc-media-client.gemspec
6
+ gemspec
data/README.md ADDED
File without changes
@@ -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,9 @@
1
+ require_relative '../../../rest_client'
2
+
3
+ module WCC
4
+ module Media
5
+ class Client < RestClient
6
+ VERSION = '0.1.0'.freeze
7
+ end
8
+ end
9
+ 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,3 @@
1
+ require "bundler/gem_helper"
2
+
3
+ Bundler::GemHelper.install_tasks
@@ -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: []