wcc-media-client 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ab1f8952164ed4d304c0655216b90ec90a969ba
4
- data.tar.gz: 064456e4cb0746adf4b3f824b9d6ef14cad2dbeb
3
+ metadata.gz: c6f7fff717257c4c3d0b5d052cc3a6fa470d4d7e
4
+ data.tar.gz: 48d5c6b4ea93e3d413bbe88e31f35d8a08437939
5
5
  SHA512:
6
- metadata.gz: 4e83253123e385d7c2d45f7dbb714aacebea52aa8466061349489b0cab6b1dd0b8faf3425575f019ba79bb9928d799b8c0eb3d0b88ae0e77fb36582a62850656
7
- data.tar.gz: bef64997aec54a3d860686e0f322b1cfb0b5705cf4ec783835d790d12879c006d9afd76bcb591b3dfd56c7d7e3da99d78bbbbdef7d9094c0eaec456e104c8d91
6
+ metadata.gz: b6daa3c34162ead40627b16a930d8336864a15527c871eb4f02113cfa0a2be6022d26d6ecd3fd53cd19b94c1e63c1b2ed0db0556aafdd2fbc656c2b00ede3a53
7
+ data.tar.gz: 2e6c537ea480120c8d72b87b54bf8c79012980df1516c48314cd9d4ee3d48a28cdc8415f4bb8bfe30cc5d0f2d2c6cb4661e4c754d2814b48d87dbb6f6cfb7804
@@ -12,13 +12,4 @@ class HttpAdapter
12
12
  HTTP[headers].get(url, params: query)
13
13
  end
14
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
15
  end
@@ -18,18 +18,6 @@ class RestClient
18
18
  )
19
19
  end
20
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
21
  Response =
34
22
  Struct.new(:raw) do
35
23
  extend Forwardable
@@ -0,0 +1,77 @@
1
+ module WCC::Media::ActiveRecordShim
2
+ def self.included(base)
3
+ base.public_send :include, InstanceMethods
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module InstanceMethods
8
+ def attributes
9
+ raw
10
+ end
11
+ end
12
+
13
+ module ClassMethods
14
+ def active_record_shim(&block)
15
+ builder = ShimBuilder.new
16
+ builder.instance_eval(&block)
17
+ builder.apply(self)
18
+ self
19
+ end
20
+
21
+ def find(id)
22
+ client.public_send(endpoint).find(id)
23
+ end
24
+
25
+ def find_all(**filters)
26
+ client.public_send(endpoint).list(filters)
27
+ end
28
+
29
+ def find_by(**filters)
30
+ raise ArgumentError, "You must provide at least one filter" if filters.empty?
31
+
32
+ find_all(filters).first
33
+ end
34
+
35
+ def model_name
36
+ name
37
+ end
38
+
39
+ def table_name
40
+ endpoint
41
+ end
42
+
43
+ def unscoped
44
+ yield
45
+ end
46
+
47
+ def find_in_batches(options, &block)
48
+ options = options ? options.dup : {}
49
+ batch_size = options.delete(:batch_size) || 1000
50
+ filter = {
51
+ limit: batch_size,
52
+ offset: options.delete(:start) || 0
53
+ }
54
+
55
+ find_all(filter).each_slice(batch_size, &block)
56
+ end
57
+ end
58
+
59
+ class ShimBuilder
60
+ def apply(klass)
61
+ filters = (@filters || []).freeze
62
+ endpoint = @endpoint || klass.name.split('::').last.downcase
63
+ name = @name || klass.name.split('::').last.downcase
64
+ klass.instance_eval do
65
+ define_singleton_method('filters') { filters }
66
+ define_singleton_method('endpoint') { endpoint }
67
+ define_singleton_method('name') { name }
68
+ define_singleton_method('client=') { |client| @client = client }
69
+ define_singleton_method('client') { @client || WCC::Media::Client.default }
70
+ end
71
+ end
72
+
73
+ [:filters, :endpoint, :name].each do |att|
74
+ class_eval("def #{att}(value); @#{att} = value; end", __FILE__, __LINE__)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'cacheable'
2
+ require_relative 'active_record_shim'
3
+
4
+ module WCC
5
+ module Media
6
+ class Base
7
+ include WCC::Media::Cacheable
8
+ include WCC::Media::ActiveRecordShim
9
+
10
+ attr_reader :raw, :headers
11
+
12
+ def initialize(raw, headers = {})
13
+ @raw = raw
14
+ @headers = headers
15
+ end
16
+ end
17
+ end
18
+ end
@@ -8,6 +8,10 @@ require_relative 'client/response'
8
8
  module WCC
9
9
  module Media
10
10
  class Client < RestClient
11
+ def self.default
12
+ @default ||= new
13
+ end
14
+
11
15
  PARAMS = %w[
12
16
  limit
13
17
  offset
@@ -16,128 +20,70 @@ module WCC
16
20
  target
17
21
  ].freeze
18
22
 
23
+ RESOURCES = {
24
+ 'messages' => WCC::Media::Message,
25
+ 'series' => WCC::Media::Series,
26
+ 'speakers' => WCC::Media::Speaker,
27
+ 'tags' => WCC::Media::Tag
28
+ }.freeze
29
+ attr_reader(*RESOURCES.keys)
30
+
31
+ attr_reader :options
32
+
19
33
  def initialize(**options)
20
34
  options = {
21
35
  api_url: 'https://media.watermark.org/api/v1/',
22
36
  response_class: Response
23
37
  }.merge!(options)
24
38
  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'], resp.headers.freeze)
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'], resp.headers.freeze)
76
- end
77
39
 
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'], resp.headers.freeze)
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'], resp.headers.freeze)
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
40
+ RESOURCES.each do |(endpoint, model)|
41
+ instance_variable_set("@#{endpoint}", Resource.new(self, model, @options))
132
42
  end
133
43
  end
134
44
 
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)
45
+ Resource =
46
+ Struct.new(:client, :model, :options) do
47
+ def find(id)
48
+ resp = client.get("#{model.endpoint}/#{id}")
49
+ resp.assert_ok!
50
+ model.new(resp.body[model.name], resp.headers.freeze)
51
+ end
52
+
53
+ def list(**filters)
54
+ query = extract_params(filters)
55
+ query = query.merge!(apply_filters(filters, model.filters))
56
+ resp = client.get(model.endpoint, query)
57
+ resp.assert_ok!
58
+ resp.items.map { |s| model.new(s) }
59
+ end
60
+
61
+ private
62
+
63
+ def extract_params(filters)
64
+ filters.each_with_object({}) do |(k, _v), h|
65
+ k_s = k.to_s
66
+ h[k_s] = filters.delete(k) if PARAMS.include?(k_s)
67
+ end
68
+ end
69
+
70
+ def apply_filters(filters, expected_filters)
71
+ defaults = default_filters(expected_filters) || {}
72
+ filters.each_with_object(defaults) do |(k, v), h|
73
+ k = k.to_s
74
+ raise ArgumentError, "Unknown filter '#{k}'" unless expected_filters.include?(k)
75
+
76
+ h["filter[#{k}]"] = v
77
+ end
78
+ end
79
+
80
+ def default_filters(expected_filters)
81
+ options[:default_filters]&.each_with_object({}) do |(k, v), h|
82
+ k = k.to_s
83
+ h["filter[#{k}]"] = v if expected_filters.include?(k)
84
+ end
85
+ end
139
86
  end
140
- end
141
87
  end
142
88
  end
143
89
  end
@@ -3,7 +3,7 @@ require_relative '../../../rest_client'
3
3
  module WCC
4
4
  module Media
5
5
  class Client < RestClient
6
- VERSION = '0.1.1'.freeze
6
+ VERSION = '0.2.0'.freeze
7
7
  end
8
8
  end
9
9
  end
@@ -1,68 +1,69 @@
1
- require_relative 'cacheable'
1
+ require_relative 'base'
2
2
 
3
- module WCC
4
- module Media
5
- class Message
6
- include WCC::Media::Cacheable
7
-
8
- attr_reader :raw, :headers
9
-
10
- def initialize(raw, headers = {})
11
- @raw = raw
12
- @headers = headers
13
- end
3
+ class WCC::Media::Message < WCC::Media::Base
4
+ active_record_shim do
5
+ endpoint 'messages'
6
+ filters %w[
7
+ on_or_after_date
8
+ on_or_before_date
9
+ tag_id
10
+ speaker_id
11
+ scripture_book_id
12
+ series_id
13
+ title_like
14
+ legacy_id
15
+ ].freeze
16
+ end
14
17
 
15
- def id
16
- raw['id']&.to_s
17
- end
18
+ def id
19
+ raw['id']&.to_s
20
+ end
18
21
 
19
- def legacy_id
20
- raw['legacy_id']&.to_s
21
- end
22
+ def legacy_id
23
+ raw['legacy_id']&.to_s
24
+ end
22
25
 
23
- %w[
24
- date
25
- title
26
- description
27
- series_position
28
- ].each do |att|
29
- define_method att do
30
- raw[att]
31
- end
32
- end
26
+ %w[
27
+ date
28
+ title
29
+ description
30
+ series_position
31
+ ].each do |att|
32
+ define_method att do
33
+ raw[att]
34
+ end
35
+ end
33
36
 
34
- def speakers
35
- (raw['speakers'] || []).map { |val| Speaker.new(val) }
36
- end
37
+ def speakers
38
+ (raw['speakers'] || []).map { |val| WCC::Media::Speaker.new(val) }
39
+ end
37
40
 
38
- def tags
39
- (raw['tags'] || []).map { |val| Tag.new(val) }
40
- end
41
+ def tags
42
+ (raw['tags'] || []).map { |val| WCC::Media::Tag.new(val) }
43
+ end
41
44
 
42
- %w[
43
- scripture_references
44
- downloads
45
- ].each do |att|
46
- define_method att do
47
- (raw[att] || []).map { |val| OpenStruct.new(val) }
48
- end
49
- end
45
+ %w[
46
+ scripture_references
47
+ downloads
48
+ ].each do |att|
49
+ define_method att do
50
+ (raw[att] || []).map { |val| OpenStruct.new(val) }
51
+ end
52
+ end
50
53
 
51
- def series
52
- Series.new(raw['series']) if raw['series']
53
- end
54
+ def series
55
+ WCC::Media::Series.new(raw['series']) if raw['series']
56
+ end
54
57
 
55
- %w[
56
- embeds
57
- assets
58
- images
59
- external_urls
60
- transcript
61
- ].each do |att|
62
- define_method att do
63
- OpenStruct.new(raw[att]) if raw[att]
64
- end
65
- end
58
+ %w[
59
+ embeds
60
+ assets
61
+ images
62
+ external_urls
63
+ transcript
64
+ ].each do |att|
65
+ define_method att do
66
+ OpenStruct.new(raw[att]) if raw[att]
66
67
  end
67
68
  end
68
69
  end
@@ -1,42 +1,45 @@
1
- module WCC
2
- module Media
3
- class Series
4
- include WCC::Media::Cacheable
1
+ require_relative 'base'
5
2
 
6
- attr_reader :raw, :headers
7
-
8
- def initialize(raw, headers = {})
9
- @raw = raw
10
- @headers = headers
11
- end
3
+ class WCC::Media::Series < WCC::Media::Base
4
+ active_record_shim do
5
+ filters %w[
6
+ begin_on_or_before_date
7
+ begin_on_or_after_date
8
+ end_on_or_before_date
9
+ end_on_or_after_date
10
+ tag_id
11
+ speaker_id
12
+ scripture_book_id
13
+ title_like
14
+ legacy_id
15
+ ]
16
+ end
12
17
 
13
- def id
14
- raw['id']&.to_s
15
- end
18
+ def id
19
+ raw['id']&.to_s
20
+ end
16
21
 
17
- def legacy_id
18
- raw['legacy_id']&.to_s
19
- end
22
+ def legacy_id
23
+ raw['legacy_id']&.to_s
24
+ end
20
25
 
21
- %w[
22
- title
23
- subtitle
24
- summary
25
- date_range
26
- messages_count
27
- ].each do |att|
28
- define_method att do
29
- raw[att]
30
- end
31
- end
26
+ %w[
27
+ title
28
+ subtitle
29
+ summary
30
+ date_range
31
+ messages_count
32
+ ].each do |att|
33
+ define_method att do
34
+ raw[att]
35
+ end
36
+ end
32
37
 
33
- %w[
34
- images
35
- ].each do |att|
36
- define_method att do
37
- OpenStruct.new(raw[att]) if raw[att]
38
- end
39
- end
38
+ %w[
39
+ images
40
+ ].each do |att|
41
+ define_method att do
42
+ OpenStruct.new(raw[att]) if raw[att]
40
43
  end
41
44
  end
42
45
  end
@@ -1,31 +1,29 @@
1
- module WCC
2
- module Media
3
- class Speaker
4
- include WCC::Media::Cacheable
1
+ require_relative 'base'
5
2
 
6
- attr_reader :raw, :headers
7
-
8
- def initialize(raw, headers = {})
9
- @raw = raw
10
- @headers = headers
11
- end
3
+ class WCC::Media::Speaker < WCC::Media::Base
4
+ active_record_shim do
5
+ endpoint 'speakers'
6
+ filters %w[
7
+ featured
8
+ name_like
9
+ tag_id
10
+ ]
11
+ end
12
12
 
13
- def id
14
- raw['id']&.to_s
15
- end
13
+ def id
14
+ raw['id']&.to_s
15
+ end
16
16
 
17
- def legacy_id
18
- raw['legacy_id']&.to_s
19
- end
17
+ def legacy_id
18
+ raw['legacy_id']&.to_s
19
+ end
20
20
 
21
- %w[
22
- featured
23
- name
24
- ].each do |att|
25
- define_method att do
26
- raw[att]
27
- end
28
- end
21
+ %w[
22
+ featured
23
+ name
24
+ ].each do |att|
25
+ define_method att do
26
+ raw[att]
29
27
  end
30
28
  end
31
29
  end
data/lib/wcc/media/tag.rb CHANGED
@@ -1,30 +1,26 @@
1
- module WCC
2
- module Media
3
- class Tag
4
- include WCC::Media::Cacheable
1
+ require_relative 'base'
5
2
 
6
- attr_reader :raw, :headers
7
-
8
- def initialize(raw, headers = {})
9
- @raw = raw
10
- @headers = headers
11
- end
3
+ class WCC::Media::Tag < WCC::Media::Base
4
+ active_record_shim do
5
+ endpoint 'tags'
6
+ filters %w[
7
+ name_like
8
+ ]
9
+ end
12
10
 
13
- def id
14
- raw['id']&.to_s
15
- end
11
+ def id
12
+ raw['id']&.to_s
13
+ end
16
14
 
17
- def legacy_id
18
- raw['legacy_id']&.to_s
19
- end
15
+ def legacy_id
16
+ raw['legacy_id']&.to_s
17
+ end
20
18
 
21
- %w[
22
- name
23
- ].each do |att|
24
- define_method att do
25
- raw[att]
26
- end
27
- end
19
+ %w[
20
+ name
21
+ ].each do |att|
22
+ define_method att do
23
+ raw[att]
28
24
  end
29
25
  end
30
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wcc-media-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Watermark Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-08 00:00:00.000000000 Z
11
+ date: 2018-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -144,6 +144,8 @@ files:
144
144
  - lib/rest_client/http_adapter.rb
145
145
  - lib/rest_client/response.rb
146
146
  - lib/rest_client/typhoeus_adapter.rb
147
+ - lib/wcc/media/active_record_shim.rb
148
+ - lib/wcc/media/base.rb
147
149
  - lib/wcc/media/cacheable.rb
148
150
  - lib/wcc/media/client.rb
149
151
  - lib/wcc/media/client/response.rb