poms 0.0.10 → 1.0.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 +4 -4
- data/Gemfile.lock +2 -2
- data/Guardfile +4 -4
- data/Rakefile +6 -6
- data/lib/poms.rb +65 -44
- data/lib/poms/base.rb +1 -0
- data/lib/poms/broadcast.rb +7 -6
- data/lib/poms/builder.rb +36 -29
- data/lib/poms/builderless/broadcast.rb +2 -1
- data/lib/poms/builderless/clip.rb +1 -1
- data/lib/poms/connect.rb +5 -7
- data/lib/poms/has_ancestors.rb +20 -8
- data/lib/poms/has_base_attributes.rb +11 -2
- data/lib/poms/merged_series.rb +27 -0
- data/lib/poms/poms_error.rb +5 -0
- data/lib/poms/schedule_event.rb +7 -9
- data/lib/poms/season.rb +2 -2
- data/lib/poms/series.rb +4 -4
- data/lib/poms/version.rb +2 -1
- data/lib/poms/views.rb +6 -2
- data/poms.gemspec +21 -20
- data/spec/fabricators/poms_fabricator.rb +8 -3
- data/spec/fixtures/vcr_cassettes/poms/merged_series/is_enumerable.yml +46 -0
- data/spec/fixtures/vcr_cassettes/poms/merged_series/turns_the_json_into_a_hash.yml +46 -0
- data/spec/integration/poms_spec.rb +1 -2
- data/spec/lib/poms/broadcast_spec.rb +11 -6
- data/spec/lib/poms/builder_spec.rb +36 -2
- data/spec/lib/poms/merged_series_spec.rb +28 -0
- data/spec/lib/poms/schedule_event_spec.rb +3 -3
- data/spec/lib/poms/views_spec.rb +6 -6
- data/spec/lib/poms_spec.rb +35 -32
- data/spec/spec_helper.rb +4 -2
- metadata +10 -2
data/lib/poms/connect.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module Poms
|
2
|
+
# Module that gets json from a url.
|
2
3
|
module Connect
|
3
|
-
|
4
4
|
def get_json(uri)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
nil
|
10
|
-
end
|
5
|
+
JSON.parse(open(uri).read)
|
6
|
+
rescue OpenURI::HTTPError => e
|
7
|
+
raise e unless e.message.match(/404/)
|
8
|
+
nil
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
data/lib/poms/has_ancestors.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Poms
|
2
|
+
# Mixin for a class that has ancestors.
|
2
3
|
module HasAncestors
|
3
4
|
module ClassMethods
|
4
|
-
|
5
5
|
end
|
6
6
|
|
7
7
|
module InstanceMethods
|
8
8
|
def series
|
9
9
|
return @series if @series
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
return [] if descendant_of.blank?
|
11
|
+
descendant_series = descendant_of.reject do |obj|
|
12
|
+
obj.class != Poms::Series
|
13
|
+
end
|
14
|
+
if descendant_series.blank?
|
14
15
|
descendant_of
|
15
16
|
else
|
16
17
|
descendant_series
|
@@ -28,9 +29,20 @@ module Poms
|
|
28
29
|
|
29
30
|
def ancestor_mids
|
30
31
|
return @ancestor_mids if @ancestor_mids
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
@ancestor_mids = (descendant_of_mids +
|
33
|
+
episode_of_mids).flatten.compact.uniq
|
34
|
+
end
|
35
|
+
|
36
|
+
def descendant_of_mids
|
37
|
+
descendant_of.map(&:mid_ref)
|
38
|
+
rescue
|
39
|
+
[]
|
40
|
+
end
|
41
|
+
|
42
|
+
def episode_of_mids
|
43
|
+
episode_of.map(&:mid_ref)
|
44
|
+
rescue
|
45
|
+
[]
|
34
46
|
end
|
35
47
|
end
|
36
48
|
|
@@ -1,14 +1,23 @@
|
|
1
1
|
module Poms
|
2
|
+
# Mixin for classes with a title and description.
|
2
3
|
module HasBaseAttributes
|
3
4
|
def title
|
4
5
|
return @title if @title
|
5
6
|
main_title = select_title_by_type 'MAIN'
|
6
7
|
sub_title = select_title_by_type 'SUB'
|
7
|
-
|
8
|
+
if sub_title && sub_title.match(main_title)
|
9
|
+
@titel = sub_title
|
10
|
+
else
|
11
|
+
@titel = [main_title, sub_title].compact.join(': ')
|
12
|
+
end
|
8
13
|
end
|
9
14
|
|
10
15
|
def description
|
11
|
-
@description ||=
|
16
|
+
@description ||= begin
|
17
|
+
descriptions.first.value
|
18
|
+
rescue
|
19
|
+
nil
|
20
|
+
end
|
12
21
|
end
|
13
22
|
|
14
23
|
private
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module Poms
|
5
|
+
# Methods for working with the merged series api from NPO.
|
6
|
+
module MergedSeries
|
7
|
+
extend self
|
8
|
+
|
9
|
+
API_URL = 'https://rs-test.poms.omroep.nl/v1/api/media/redirects/'.freeze
|
10
|
+
|
11
|
+
# Gets the merged serie mids as a hash. Expects a JSON response from
|
12
|
+
# the server with a `map` key.
|
13
|
+
# Throws a PomsError if the call timeouts, has an HTTP error or JSON parse
|
14
|
+
# error.
|
15
|
+
#
|
16
|
+
# @param api_url the API url to query
|
17
|
+
# @return [Hash] a hash with old_mid => new_mid pairs
|
18
|
+
def serie_mids(api_url = API_URL)
|
19
|
+
Timeout.timeout(3) do
|
20
|
+
data = open(api_url).read
|
21
|
+
JSON.parse(data).fetch('map')
|
22
|
+
end
|
23
|
+
rescue OpenURI::HTTPError, JSON::ParserError, Timeout::Error => e
|
24
|
+
raise Poms::PomsError, e.message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/poms/schedule_event.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Poms
|
2
|
+
# POMS wrapper for a single scheduled broadcast.
|
2
3
|
class ScheduleEvent < Poms::Builder::NestedOpenStruct
|
3
|
-
|
4
|
-
def initialize hash
|
4
|
+
def initialize(hash)
|
5
5
|
@hash = hash
|
6
6
|
set_start_and_end_times
|
7
7
|
super @hash
|
@@ -16,11 +16,11 @@ module Poms
|
|
16
16
|
|
17
17
|
def set_starts_at
|
18
18
|
@hash[:starts_at] = case @hash[:start]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
when String, Integer
|
20
|
+
Time.at @hash[:start] / 1000
|
21
|
+
when Time
|
22
|
+
@hash[:start]
|
23
|
+
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def set_ends_at
|
@@ -30,7 +30,5 @@ module Poms
|
|
30
30
|
def duration
|
31
31
|
(@hash[:duration].to_i / 1000).seconds
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
end
|
36
|
-
|
data/lib/poms/season.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'poms/has_ancestors'
|
2
2
|
|
3
3
|
module Poms
|
4
|
+
# Poms wrapper for a season of a serie.
|
4
5
|
class Season < Poms::Builder::NestedOpenStruct
|
5
6
|
include Poms::HasBaseAttributes
|
6
7
|
include Poms::HasAncestors
|
7
8
|
|
8
9
|
def related_group_mids
|
9
|
-
descendant_of.map
|
10
|
+
descendant_of.map(&:mid_ref)
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
13
|
-
|
data/lib/poms/series.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'poms/has_base_attributes'
|
2
2
|
|
3
3
|
module Poms
|
4
|
+
# POMS wrapper for a TV Serie.
|
4
5
|
class Series < Poms::Builder::NestedOpenStruct
|
5
6
|
include Poms::HasBaseAttributes
|
6
|
-
|
7
|
+
|
7
8
|
def related_group_mids
|
8
|
-
Poms.fetch_descendants_for_serie(mid, 'SEASON').map
|
9
|
-
end
|
9
|
+
Poms.fetch_descendants_for_serie(mid, 'SEASON').map(&:mid)
|
10
|
+
end
|
10
11
|
end
|
11
12
|
end
|
12
|
-
|
data/lib/poms/version.rb
CHANGED
data/lib/poms/views.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'poms/connect'
|
2
2
|
|
3
|
-
# Constructs urls for Poms
|
4
3
|
module Poms
|
4
|
+
# Views constructs the urls that can be used to access specific views in POMS.
|
5
5
|
module Views
|
6
6
|
include Poms::Connect
|
7
7
|
extend self
|
@@ -20,7 +20,10 @@ module Poms
|
|
20
20
|
construct_view_url('by-group', args)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
# rubocop:disable Metrics/MethodLength
|
24
|
+
def broadcasts_by_channel_and_start(channel, start_time = Time.now,
|
25
|
+
end_time = 1.day.ago, limit = 1,
|
26
|
+
descending = true)
|
24
27
|
args = {
|
25
28
|
startkey: "[\"#{channel}\", #{to_poms_timestamp(start_time)}]",
|
26
29
|
endkey: "[\"#{channel}\", #{to_poms_timestamp(end_time)}]",
|
@@ -31,6 +34,7 @@ module Poms
|
|
31
34
|
}
|
32
35
|
construct_view_url('broadcasts-by-channel-and-start', args)
|
33
36
|
end
|
37
|
+
# rubocop:enable Metrics/MethodLength
|
34
38
|
|
35
39
|
private
|
36
40
|
|
data/poms.gemspec
CHANGED
@@ -5,28 +5,29 @@ require 'poms/version'
|
|
5
5
|
require 'rake'
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
8
|
+
spec.name = 'poms'
|
9
9
|
spec.version = Poms::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
12
|
-
|
13
|
-
spec.
|
14
|
-
spec.
|
15
|
-
spec.
|
10
|
+
spec.authors = ['Tom Kruijsen', 'Stijn Meurkens', 'Tijn Schuurmans']
|
11
|
+
spec.email = ['tom@brightin.nl', 'stijn@brightin.nl',
|
12
|
+
'tijn@brightin.nl']
|
13
|
+
spec.description = 'Interface to POMS CouchDB API'
|
14
|
+
spec.summary = 'Interfcae to POMS CouchDB API'
|
15
|
+
spec.homepage = 'https://github.com/brightin/poms'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
|
-
spec.files = FileList['lib/**/*.rb',
|
18
|
+
spec.files = FileList['lib/**/*.rb', '[A-Z]*', 'spec/**/*'].to_a
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
20
21
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_dependency
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
23
|
+
spec.add_development_dependency 'rake'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'guard'
|
26
|
+
spec.add_development_dependency 'guard-rspec'
|
27
|
+
spec.add_development_dependency 'fakeweb'
|
28
|
+
spec.add_development_dependency 'fabrication'
|
29
|
+
spec.add_development_dependency 'rubocop'
|
30
|
+
spec.add_development_dependency 'timecop'
|
31
|
+
spec.add_development_dependency 'vcr'
|
32
|
+
spec.add_dependency 'activesupport'
|
32
33
|
end
|
@@ -14,10 +14,13 @@ Fabricator(:poms_broadcast_pippi_langkous, class_name: :"Poms::Broadcast") do
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
Fabricator(:poms_broadcast_multiple_schedule_events,
|
17
|
+
Fabricator(:poms_broadcast_multiple_schedule_events,
|
18
|
+
class_name: :"Poms::Broadcast") do
|
18
19
|
initialize_with do
|
19
20
|
Poms::Builder.process_hash(
|
20
|
-
JSON.parse
|
21
|
+
JSON.parse(
|
22
|
+
File.read('spec/fixtures/poms_broadcast_multiple_schedule_events.json')
|
23
|
+
)
|
21
24
|
)
|
22
25
|
end
|
23
26
|
end
|
@@ -33,7 +36,9 @@ end
|
|
33
36
|
Fabricator(:zapp_broadcasts, class_name: :array) do
|
34
37
|
initialize_with do
|
35
38
|
hash = JSON.parse File.read('spec/fixtures/poms_zapp.json')
|
36
|
-
array = hash['rows'].take(10).map
|
39
|
+
array = hash['rows'].take(10).map do |item|
|
40
|
+
Poms::Builder.process_hash item['doc']
|
41
|
+
end
|
37
42
|
array
|
38
43
|
end
|
39
44
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://rs-test.poms.omroep.nl/v1/api/media/redirects/
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept-encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
accept:
|
13
|
+
- "*/*"
|
14
|
+
user-agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
date:
|
22
|
+
- Tue, 05 Jan 2016 16:49:33 GMT
|
23
|
+
server:
|
24
|
+
- Apache/2.4.12 (Unix) OpenSSL/1.0.1k
|
25
|
+
vary:
|
26
|
+
- Accept
|
27
|
+
cache-control:
|
28
|
+
- public
|
29
|
+
etag:
|
30
|
+
- '"47646207"'
|
31
|
+
last-modified:
|
32
|
+
- Tue, 05 Jan 2016 08:47:10 GMT
|
33
|
+
content-type:
|
34
|
+
- application/json;charset=utf-8
|
35
|
+
x-proxyinstancename:
|
36
|
+
- poms1a
|
37
|
+
set-cookie:
|
38
|
+
- balancer://poms8cluster=balancer.poms8aas; path=/;
|
39
|
+
transfer-encoding:
|
40
|
+
- chunked
|
41
|
+
body:
|
42
|
+
encoding: UTF-8
|
43
|
+
string: '{"lastUpdate":"2016-01-05T09:47:10.672+01:00","map":{"POMS_S_EO_097367":"VPWON_1257896"}}'
|
44
|
+
http_version: '1.1'
|
45
|
+
recorded_at: Tue, 06 Oct 2015 12:00:00 GMT
|
46
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,46 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://rs-test.poms.omroep.nl/v1/api/media/redirects/
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept-encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
accept:
|
13
|
+
- "*/*"
|
14
|
+
user-agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
date:
|
22
|
+
- Tue, 05 Jan 2016 16:34:17 GMT
|
23
|
+
server:
|
24
|
+
- Apache/2.4.12 (Unix) OpenSSL/1.0.1k
|
25
|
+
vary:
|
26
|
+
- Accept
|
27
|
+
cache-control:
|
28
|
+
- public
|
29
|
+
etag:
|
30
|
+
- '"47646207"'
|
31
|
+
last-modified:
|
32
|
+
- Tue, 05 Jan 2016 08:47:10 GMT
|
33
|
+
content-type:
|
34
|
+
- application/json;charset=utf-8
|
35
|
+
x-proxyinstancename:
|
36
|
+
- poms1a
|
37
|
+
set-cookie:
|
38
|
+
- balancer://poms8cluster=balancer.poms8aas; path=/;
|
39
|
+
transfer-encoding:
|
40
|
+
- chunked
|
41
|
+
body:
|
42
|
+
encoding: UTF-8
|
43
|
+
string: '{"lastUpdate":"2016-01-05T09:47:10.672+01:00","map":{"POMS_S_EO_097367":"VPWON_1257896"}}'
|
44
|
+
http_version: '1.1'
|
45
|
+
recorded_at: Tue, 06 Oct 2015 12:00:00 GMT
|
46
|
+
recorded_with: VCR 2.9.3
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Poms do
|
4
|
-
|
5
4
|
describe '#fetch_current_broadcast' do
|
6
5
|
let(:current_broadcast) { Poms.fetch_current_broadcast('NED3') }
|
7
6
|
|
@@ -71,5 +70,5 @@ describe Poms do
|
|
71
70
|
end
|
72
71
|
|
73
72
|
describe '#upcoming_broadcasts'
|
74
|
-
describe '#fetch_descendant_mids'
|
73
|
+
describe '#fetch_descendant_mids'
|
75
74
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Poms::Broadcast do
|
4
|
-
|
5
4
|
let(:poms_broadcast) { Fabricate(:poms_broadcast) }
|
6
5
|
# pippi langkous is a peculiar case, as it has no series, just a season
|
7
6
|
let(:poms_pippi_langkous) { Fabricate(:poms_broadcast_pippi_langkous) }
|
@@ -15,18 +14,22 @@ describe Poms::Broadcast do
|
|
15
14
|
end
|
16
15
|
|
17
16
|
it 'correctly sets the description' do
|
18
|
-
description =
|
17
|
+
description = 'Li biedt Barry een baantje aan bij de uitdragerij en ' \
|
18
|
+
'vraagt zich meteen af of dat wel zo slim was. Timon en Joep zien de ' \
|
19
|
+
'criminele organisatie de Rijland Angels. Timon wil naar hun loods, maar ' \
|
20
|
+
'is dat wel een goed idee?'
|
19
21
|
expect(poms_broadcast.description).to eq(description)
|
20
22
|
end
|
21
23
|
|
22
|
-
it 'converts schedule events to Poms::ScheduleEvent'
|
24
|
+
it 'converts schedule events to Poms::ScheduleEvent' do
|
23
25
|
poms_broadcast.schedule_events.each do |e|
|
24
26
|
expect(e.class).to eq(Poms::ScheduleEvent)
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
it 'correctly sets available until' do
|
29
|
-
expect(poms_broadcast.available_until)
|
31
|
+
expect(poms_broadcast.available_until)
|
32
|
+
.to eq(Time.at(1_435_381_968).to_datetime)
|
30
33
|
end
|
31
34
|
|
32
35
|
it 'sets the serie correctly when a broadcast only has a season, no series' do
|
@@ -34,11 +37,13 @@ describe Poms::Broadcast do
|
|
34
37
|
end
|
35
38
|
|
36
39
|
it 'returns the available streams' do
|
37
|
-
expect(poms_broadcast.odi_streams)
|
40
|
+
expect(poms_broadcast.odi_streams)
|
41
|
+
.to eq(%w(adaptive h264_sb h264_bb h264_std wvc1_std wmv_sb wmv_bb))
|
38
42
|
end
|
39
43
|
|
40
44
|
it 'return the ancestors of the broadcast' do
|
41
45
|
# I use to_set as the order does not matter
|
42
|
-
expect(poms_broadcast.ancestor_mids.to_set)
|
46
|
+
expect(poms_broadcast.ancestor_mids.to_set)
|
47
|
+
.to eq(%w(POMS_S_KRO_059857 KRO_1521173).to_set)
|
43
48
|
end
|
44
49
|
end
|