wcc-media-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []