wcc-media-client 0.1.1 → 0.2.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 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