poms 2.3.1 → 2.4.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: 645a283cdf22cf6bf5ee6d01140c7e3d0981f277
4
- data.tar.gz: 30c1d1656d2c7d98605f34a05e176e412f2af559
3
+ metadata.gz: ca74a26e7ddddcefe3cf672fb7a5503f9c89d519
4
+ data.tar.gz: 26b66cddf53204d26e438fa59f05b9dfa80e8dfc
5
5
  SHA512:
6
- metadata.gz: 4b2bd125936c59c1840e215ea9c410e1cd355b0fdbdbc23252eaee2726368853ec44b548d24d0a2ff3dee45e6e3efe7b277e6eced5d1495b46a7a98378d2b763
7
- data.tar.gz: b4fad474ea904415dedf6a11708a1ea6fb0ede925f6407b396e8bed4058e0c736697faedc5e8f3ea6b5bc8c217d9516eb886d1a1aad36c519b781b8949d909e9
6
+ metadata.gz: 5ca9b10cc25fa8e2c7ca97bedf79945ddea44d411b19f9fbbb2acf38774ffbccd9053ae2e958c62ce030d248cafc0c2636c0ea1d776218662ca7bc6a4369745d
7
+ data.tar.gz: fbf4ddc8db109d6d7b2fcea5e3ae7203a9a6d5662290e567e60b22ef57f5e55e24b9a2714f3687bbdd718254f3dc720955051f9f6ec90237771bb0fa5ada607e
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .ruby-version
19
+ .rbenv-vars
@@ -30,6 +30,9 @@ Style/AndOr:
30
30
  Style/FrozenStringLiteralComment:
31
31
  Enabled: false
32
32
 
33
+ Style/ModuleFunction:
34
+ Enabled: false
35
+
33
36
  ModuleLength:
34
37
  Exclude:
35
38
  - spec/**/*_spec.rb # specs are only in module for easier access to functions
@@ -4,6 +4,10 @@
4
4
 
5
5
  * Add `Poms::Fields.descendants_of` which returns all descendantOf's of specific type.
6
6
 
7
+ ## 2.3.0
8
+
9
+ * Make `members` run as a POST request.
10
+
7
11
  ## 2.2.1
8
12
 
9
13
  * Add `Poms::Fields.broadcasts` which returns the associated broadcasters in an Array
data/README.md CHANGED
@@ -84,3 +84,7 @@ Gem | API
84
84
  3. Commit your changes (`git commit -am 'Add some feature'`)
85
85
  4. Push to the branch (`git push origin my-new-feature`)
86
86
  5. Create new Pull Request
87
+
88
+ ## Releasing
89
+
90
+ Make sure to use [Semantic Versioning](https://semver.org/) when bumping the version. To release tag the master branch with the version and then push to rubygems. `rake release` does this for you.
@@ -1,167 +1,13 @@
1
- require 'poms/timestamp'
1
+ require 'poms/fields/details'
2
+ require 'poms/fields/media'
3
+ require 'poms/fields/schedule'
2
4
 
3
5
  module Poms
4
- # This module contains functions to extract things from a Poms hash that may
5
- # be harder to access, or are accessed in multiple places.
6
+ # Collection module that import the various field modules to the higher
7
+ # Poms::Fields level
6
8
  module Fields
7
- module_function
8
-
9
- IMAGE_TYPE_PRIORITY = %w[PROMO_LANDSCAPE PICTURE].freeze
10
-
11
- # Returns the title, main by default
12
- def title(item, type = 'MAIN')
13
- value_of_type(item, 'titles', type)
14
- end
15
-
16
- # Returns the description, main by default
17
- def description(item, type = 'MAIN')
18
- value_of_type(item, 'descriptions', type)
19
- end
20
-
21
- # Returns all the descendantOfs of the type given.
22
- # @param item The Poms Hash
23
- # @param type The type of descendantOfs we want
24
- def descendants_of(item, type)
25
- item['descendantOf'].select { |descendant| descendant['type'] == type }
26
- end
27
-
28
- def broadcasters(item)
29
- Array(item['broadcasters']).map do |key_value_pair|
30
- key_value_pair['value']
31
- end
32
- end
33
-
34
- # Returns the images from the hash
35
- def images(item)
36
- item['images'].try(:sort_by) do |i|
37
- image_order_index(i)
38
- end
39
- end
40
-
41
- # Extracts the image id from an image hash
42
- # Expects a hash of just an image from POMS
43
- def image_id(image)
44
- return unless image['imageUri']
45
- image['imageUri'].split(':').last
46
- end
47
-
48
- def image_order_index(image)
49
- IMAGE_TYPE_PRIORITY.index(image['type']) || IMAGE_TYPE_PRIORITY.size
50
- end
51
-
52
- # Returns the id of the first image or nil if there are none.
53
- def first_image_id(item)
54
- return unless images(item)
55
- image_id(images(item).first)
56
- end
57
-
58
- def mid(item)
59
- item['mid']
60
- end
61
-
62
- # Returns an array of odi stream types.
63
- # Note: this code is copied from Broadcast and it is assumed it was working
64
- # there.
65
- def odi_streams(item)
66
- locations = item['locations']
67
- return [] if locations.nil? || locations.empty?
68
- odi_streams = locations.select { |l| l['programUrl'].match(/^odi/) }
69
- streams = odi_streams.map do |l|
70
- l['programUrl'].match(%r{^[\w+]+\:\/\/[\w\.]+\/video\/(\w+)\/\w+})[1]
71
- end
72
- streams.uniq
73
- end
74
-
75
- # Returns the enddate of the publication of an internet vod if present.
76
- def available_until(item)
77
- return if item['predictions'].blank?
78
- internetvod = item['predictions']
79
- .find { |p| p['platform'] == 'INTERNETVOD' }
80
- return unless internetvod
81
- Timestamp.to_datetime(internetvod['publishStop'])
82
- end
83
-
84
- # Returns the index at which it is in the parent. When no
85
- # :member_of keyword is given, it will return the first found
86
- # index. Else, when a parent is found with matching member_of
87
- # midref, it returns that index. Else returns nil.
88
- # @param item The Poms Hash
89
- # @param optional :member_of The midref of parent for which we
90
- # seek the index
91
- def position(item, member_of: nil)
92
- parent(item, midref: member_of).try(:[], 'index')
93
- end
94
-
95
- # Finds a parent the data is "member of". If :midref is given, it
96
- # will look for the parent that matches that mid and return nil if
97
- # not found. Without the :midref it will return the first parent.
98
- # @param item The Poms Hash
99
- # @param optional midref The midref of parent we seek.
100
- def parent(item, midref: nil)
101
- if midref
102
- parents(item).find { |parent| parent['midRef'] == midref }
103
- else
104
- parents(item).first
105
- end
106
- end
107
-
108
- # Returns the parents that the element is member of. Will always
109
- # return an array.
110
- def parents(item)
111
- Array(item['memberOf'])
112
- end
113
-
114
- # Returns the NICAM age rating of the item or ALL if no age rating exists
115
- def age_rating(item)
116
- item.fetch('ageRating', 'ALL')
117
- end
118
-
119
- # Returns an array containing zero or more content ratings of the item
120
- # Possible content ratings are:
121
- # ANGST, DISCRIMINATIE, DRUGS_EN_ALCOHOL, GEWELD, GROF_TAALGEBRUIK and SEKS
122
- def content_ratings(item)
123
- item.fetch('contentRatings', [])
124
- end
125
-
126
- # Returns an array of start and end times for the scheduled events for
127
- # this item. It returns an empty array if no events are found. You can pass
128
- # in a block to filter the events on data that is not returned, like
129
- # channel.
130
- #
131
- # @param item The Poms hash
132
- def schedule_events(item)
133
- events = item.fetch('scheduleEvents', [])
134
- events = yield(events) if block_given?
135
- events.map { |event| hash_event(event) }
136
- end
137
-
138
- # Turns the event into a hash.
139
- def hash_event(event)
140
- {
141
- 'starts_at' => Timestamp.to_datetime(event.fetch('start')),
142
- 'ends_at' => Timestamp.to_datetime(event.fetch('start') +
143
- event.fetch('duration'))
144
- }
145
- end
146
- private_class_method :hash_event
147
-
148
- # Poms has arrays of hashes for some types that have a value and type. This
149
- # is a way to access those simply.
150
- #
151
- # Example:
152
- # item = {'titles' => [{'value' => 'Main title', 'type' => 'MAIN'},
153
- # {'value' => 'Subtitle', 'type' => 'SUB'}] }
154
- # value_of_type(item, 'titles', 'MAIN') => 'Main title'
155
- #
156
- # @param item The Poms hash
157
- # @param key The key of the array we want to look in
158
- # @param type The type to select
159
- def value_of_type(item, key, type)
160
- return unless item && item[key]
161
- res = item[key].find { |value| value['type'] == type }
162
- return unless res
163
- res['value']
164
- end
165
- private_class_method :value_of_type
9
+ extend Poms::Fields::Details
10
+ extend Poms::Fields::Media
11
+ extend Poms::Fields::Schedule
166
12
  end
167
13
  end
@@ -0,0 +1,98 @@
1
+ require 'poms/timestamp'
2
+ module Poms
3
+ module Fields
4
+ # Module to find details from for ex. attributes on poms items.
5
+ module Details
6
+ extend self
7
+
8
+ # Returns the title, main by default
9
+ def title(item, type = 'MAIN')
10
+ value_of_type(item, 'titles', type)
11
+ end
12
+
13
+ # Returns the description, main by default
14
+ def description(item, type = 'MAIN')
15
+ value_of_type(item, 'descriptions', type)
16
+ end
17
+
18
+ # Returns all the descendantOfs of the type given.
19
+ # @param item The Poms Hash
20
+ # @param type The type of descendantOfs we want
21
+ def descendants_of(item, type)
22
+ item['descendantOf'].select { |descendant| descendant['type'] == type }
23
+ end
24
+
25
+ def broadcasters(item)
26
+ Array(item['broadcasters']).map do |key_value_pair|
27
+ key_value_pair['value']
28
+ end
29
+ end
30
+
31
+ def mid(item)
32
+ item['mid']
33
+ end
34
+
35
+ # Returns the index at which it is in the parent. When no
36
+ # :member_of keyword is given, it will return the first found
37
+ # index. Else, when a parent is found with matching member_of
38
+ # midref, it returns that index. Else returns nil.
39
+ # @param item The Poms Hash
40
+ # @param optional :member_of The midref of parent for which we
41
+ # seek the index
42
+ def position(item, member_of: nil)
43
+ parent(item, midref: member_of).try(:[], 'index')
44
+ end
45
+
46
+ # Finds a parent the data is "member of". If :midref is given, it
47
+ # will look for the parent that matches that mid and return nil if
48
+ # not found. Without the :midref it will return the first parent.
49
+ # @param item The Poms Hash
50
+ # @param optional midref The midref of parent we seek.
51
+ def parent(item, midref: nil)
52
+ if midref
53
+ parents(item).find { |parent| parent['midRef'] == midref }
54
+ else
55
+ parents(item).first
56
+ end
57
+ end
58
+
59
+ # Returns the parents that the element is member of. Will always
60
+ # return an array.
61
+ def parents(item)
62
+ Array(item['memberOf'])
63
+ end
64
+
65
+ # Returns the NICAM age rating of the item or ALL if no age rating exists
66
+ def age_rating(item)
67
+ item.fetch('ageRating', 'ALL')
68
+ end
69
+
70
+ # Returns an array containing zero or more content ratings of the item
71
+ # Possible content ratings are:
72
+ # ANGST, DISCRIMINATIE, DRUGS_EN_ALCOHOL, GEWELD, GROF_TAALGEBRUIK and
73
+ # SEKS
74
+ def content_ratings(item)
75
+ item.fetch('contentRatings', [])
76
+ end
77
+
78
+ # Poms has arrays of hashes for some types that have a value and type.
79
+ # This is a way to access those simply.
80
+ #
81
+ # Example:
82
+ # item = {'titles' => [{'value' => 'Main title', 'type' => 'MAIN'},
83
+ # {'value' => 'Subtitle', 'type' => 'SUB'}] }
84
+ # value_of_type(item, 'titles', 'MAIN') => 'Main title'
85
+ #
86
+ # @param item The Poms hash
87
+ # @param key The key of the array we want to look in
88
+ # @param type The type to select
89
+ def value_of_type(item, key, type)
90
+ return unless item && item[key]
91
+ res = item[key].find { |value| value['type'] == type }
92
+ return unless res
93
+ res['value']
94
+ end
95
+ private_class_method :value_of_type
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,34 @@
1
+ module Poms
2
+ module Fields
3
+ # Module to retrieve media related information from poms items.
4
+ module Media
5
+ extend self
6
+
7
+ IMAGE_TYPE_PRIORITY = %w[PROMO_LANDSCAPE PICTURE].freeze
8
+
9
+ # Returns the images from the hash
10
+ def images(item)
11
+ item['images'].try(:sort_by) do |i|
12
+ image_order_index(i)
13
+ end
14
+ end
15
+
16
+ # Extracts the image id from an image hash
17
+ # Expects a hash of just an image from POMS
18
+ def image_id(image)
19
+ return unless image['imageUri']
20
+ image['imageUri'].split(':').last
21
+ end
22
+
23
+ def image_order_index(image)
24
+ IMAGE_TYPE_PRIORITY.index(image['type']) || IMAGE_TYPE_PRIORITY.size
25
+ end
26
+
27
+ # Returns the id of the first image or nil if there are none.
28
+ def first_image_id(item)
29
+ return unless images(item)
30
+ image_id(images(item).first)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,78 @@
1
+ require 'poms/timestamp'
2
+
3
+ module Poms
4
+ module Fields
5
+ # modeule to retrieve scheduling/timtable related information from
6
+ # poms items.
7
+ module Schedule
8
+ extend self
9
+
10
+ # Returns an array of odi stream types.
11
+ # Note: this code is copied from Broadcast
12
+ # and it is assumed it was working there.
13
+ def odi_streams(item)
14
+ locations = item['locations']
15
+ return [] if locations.nil? || locations.empty?
16
+ odi_streams = locations.select { |l| l['programUrl'].match(/^odi/) }
17
+ streams = odi_streams.map do |l|
18
+ l['programUrl'].match(%r{^[\w+]+\:\/\/[\w\.]+\/video\/(\w+)\/\w+})[1]
19
+ end
20
+ streams.uniq
21
+ end
22
+
23
+ # Returns an array of start and end times for the scheduled events for
24
+ # this item. It returns an empty array if no events are found.
25
+ # You can pass in a block to filter the events on data that is not
26
+ # returned, like channel.
27
+ #
28
+ # @param item The Poms hash
29
+ def schedule_events(item)
30
+ events = item.fetch('scheduleEvents', [])
31
+ events = yield(events) if block_given?
32
+ events.map { |event| hash_event(event) }
33
+ end
34
+
35
+ # Returns the first publication from an items location array which has
36
+ # INTERNETVOD and is PUBLISHED
37
+ def publication(poms_item)
38
+ return if poms_item['locations'].blank?
39
+ poms_item['locations'].find do |item|
40
+ item['platform'] == 'INTERNETVOD' && item['workflow'] == 'PUBLISHED'
41
+ end
42
+ end
43
+
44
+ # Return the publishStop datetime from a publication
45
+ def publish_stop(poms_item)
46
+ published_item = publication(poms_item)
47
+ return unless published_item
48
+ Timestamp.to_datetime(published_item['publishStop'])
49
+ end
50
+
51
+ # Return the publishStart datetime from a publication
52
+ def publish_start(poms_item)
53
+ published_item = publication(poms_item)
54
+ return unless published_item
55
+ Timestamp.to_datetime(published_item['publishStart'])
56
+ end
57
+
58
+ # Returns the enddate of the publication of an internet vod if present.
59
+ def available_until(item)
60
+ return if item['predictions'].blank?
61
+ internetvod = item['predictions']
62
+ .find { |p| p['platform'] == 'INTERNETVOD' }
63
+ return unless internetvod
64
+ Timestamp.to_datetime(internetvod['publishStop'])
65
+ end
66
+
67
+ # Turns the event into a hash.
68
+ def hash_event(event)
69
+ {
70
+ 'starts_at' => Timestamp.to_datetime(event.fetch('start')),
71
+ 'ends_at' => Timestamp.to_datetime(event.fetch('start') +
72
+ event.fetch('duration'))
73
+ }
74
+ end
75
+ private_class_method :hash_event
76
+ end
77
+ end
78
+ end
@@ -1,4 +1,4 @@
1
1
  # The version
2
2
  module Poms
3
- VERSION = '2.3.1'.freeze
3
+ VERSION = '2.4.0'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poms
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Kruijsen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-24 00:00:00.000000000 Z
11
+ date: 2018-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -228,6 +228,9 @@ files:
228
228
  - lib/poms/configuration.rb
229
229
  - lib/poms/errors.rb
230
230
  - lib/poms/fields.rb
231
+ - lib/poms/fields/details.rb
232
+ - lib/poms/fields/media.rb
233
+ - lib/poms/fields/schedule.rb
231
234
  - lib/poms/timestamp.rb
232
235
  - lib/poms/version.rb
233
236
  - poms.gemspec