poms 2.1.3 → 2.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: f974c08408f4d51d55403210e099410fd2030fea
4
- data.tar.gz: a8621cc51d99c4257639d45addec5c55f4170d0f
3
+ metadata.gz: d81f89d00205f5c4f952366d4c11de426b71fa6c
4
+ data.tar.gz: 5c4e1d1f5dd4f51f5020b67e2004b815e41dcc57
5
5
  SHA512:
6
- metadata.gz: 4b0f22e2f765d73fcbe1ab67be1003f7b328c21181ebf3006d20a05a5f16049a17e63d75cdd95bc8af09229b2b4f05d16785a916115460c2adcbc790b3528578
7
- data.tar.gz: 0a6bd52ccd8123d5da464c1406599b7f182e0cb216b75032640c92e5d2c7ec4830ebc7f19c26240ef517d93ec5482339642c38935f368cc7d31514d086e990da
6
+ metadata.gz: dac6d2dec0643d289b446dc354bf603fb20332753d238310ccd722d1ce42865f0a2208162d5961d67562b7fc79e252fdde8746bbeca92bb5fcddb552128e47f9
7
+ data.tar.gz: 14b9288eed88d253cc9361b3638784154c6ac8d33550ca949f7b602ff3ece90800578e4d142fe11729ed27b95e63970a98a316ab207c29b4a36b9bfa814f2285
@@ -32,3 +32,21 @@ ModuleLength:
32
32
 
33
33
  RSpec/ExampleLength:
34
34
  Max: 15
35
+
36
+ Style/AlignParameters:
37
+ EnforcedStyle: with_fixed_indentation
38
+
39
+ Style/FirstParameterIndentation:
40
+ EnforcedStyle: consistent
41
+
42
+ Style/IndentArray:
43
+ EnforcedStyle: consistent
44
+
45
+ Style/IndentHash:
46
+ EnforcedStyle: consistent
47
+
48
+ Style/MultilineMethodCallIndentation:
49
+ EnforcedStyle: indented
50
+
51
+ Style/MultilineOperationIndentation:
52
+ EnforcedStyle: indented
@@ -1,5 +1,10 @@
1
1
  # Poms Release notes
2
2
 
3
+ ## 2.2.0
4
+
5
+ * Remove `Poms::Fields#rev` as it wasn't provided by the Poms data anyway.
6
+ * Add helper methods for NICAM ratings.
7
+
3
8
  ## 2.1.3
4
9
 
5
10
  * Order images array by likelyhood of a higher quality image (type: PROMO_LANDSCAPE > PICTURE > STILL).
data/circle.yml CHANGED
@@ -8,5 +8,4 @@ machine:
8
8
  test:
9
9
  override:
10
10
  - bundle exec rubocop
11
- - bundle exec reek
12
11
  - bundle exec rspec
@@ -1,17 +1,9 @@
1
1
  require 'poms'
2
2
 
3
- # You can build a search params hash using Poms::Api::Search
4
- query = Poms::Api::Search.build(starts_at: Time.now, ends_at: 2.weeks.from_now)
5
-
6
- # And use it to query the poms API
7
- Poms.descendants('VPWON_1251179', query)
3
+ Poms.descendants('VPWON_1251179', starts_at: Time.now, ends_at: 2.days.from_now)
8
4
  # => Returns all media that is a descendant of the media by the given mid, and
9
5
  # was broadcasted between now and next week
10
6
 
11
- # This example will fetch all media that is of type "BROADCAST"
12
- query = Poms::Api::Search.build(starts_at: Time.now, type: 'BROADCAST')
13
-
14
- # Use it
15
- Poms.descendants('VPWON_1251179', query)
7
+ Poms.descendants('VPWON_1251179', starts_at: Time.now, type: 'BROADCAST')
16
8
  # => Returns all media that is a descendant of the media by the given mid, has
17
9
  # not aired yet and is a broadcast
@@ -2,6 +2,7 @@ require 'active_support/all'
2
2
  require 'poms/api/uris'
3
3
  require 'poms/api/json_client'
4
4
  require 'poms/api/pagination_client'
5
+ require 'poms/api/request'
5
6
  require 'poms/errors'
6
7
  require 'poms/api/search'
7
8
  require 'poms/configuration'
@@ -40,33 +41,31 @@ module Poms
40
41
  # @param [String] mid
41
42
  # @raise Api::Client::HttpMissingError
42
43
  def first!(mid)
43
- Api::JsonClient.get(
44
- Api::Uris::Media.single(config.base_uri, mid),
45
- config.credentials
46
- )
44
+ Api::JsonClient.execute(build_request(
45
+ uri: Api::Uris::Media.single(config.base_uri, mid)
46
+ ))
47
47
  end
48
48
 
49
49
  def fetch(arg)
50
- Api::JsonClient.post(
51
- Api::Uris::Media.multiple(config.base_uri),
52
- Array(arg),
53
- config.credentials
54
- )
50
+ Api::JsonClient.execute(build_request(
51
+ method: :post,
52
+ uri: Api::Uris::Media.multiple(config.base_uri),
53
+ body: Array(arg)
54
+ ))
55
55
  end
56
56
 
57
57
  def descendants(mid, search_params = {})
58
- Api::PaginationClient.post(
59
- Api::Uris::Media.descendants(config.base_uri, mid),
60
- Api::Search.build(search_params),
61
- config.credentials
62
- )
58
+ Api::PaginationClient.execute(build_request(
59
+ method: :post,
60
+ uri: Api::Uris::Media.descendants(config.base_uri, mid),
61
+ body: Api::Search.build(search_params)
62
+ ))
63
63
  end
64
64
 
65
65
  def members(mid)
66
- Api::PaginationClient.get(
67
- Api::Uris::Media.members(config.base_uri, mid),
68
- config.credentials
69
- )
66
+ Api::PaginationClient.execute(build_request(
67
+ uri: Api::Uris::Media.members(config.base_uri, mid)
68
+ ))
70
69
  end
71
70
 
72
71
  # Gets the merged serie mids as a hash. Expects a JSON response from
@@ -74,30 +73,27 @@ module Poms
74
73
  #
75
74
  # @return [Hash] a hash with old_mid => new_mid pairs
76
75
  def merged_series
77
- Api::JsonClient.get(
78
- Api::Uris::Media.redirects(config.base_uri),
79
- config
80
- ).fetch('map')
76
+ Api::JsonClient.execute(build_request(
77
+ uri: Api::Uris::Media.redirects(config.base_uri)
78
+ )).fetch('map')
81
79
  end
82
80
 
83
81
  # Fetches the event for current broadcast on the given channel
84
82
  #
85
83
  # @param channel The channel name
86
84
  def scheduled_now(channel)
87
- Poms::Api::JsonClient.get(
88
- Poms::Api::Uris::Schedule.now(config.base_uri, channel),
89
- config.credentials
90
- ).fetch('items').first
85
+ Api::JsonClient.execute(build_request(
86
+ uri: Api::Uris::Schedule.now(config.base_uri, channel)
87
+ )).fetch('items').first
91
88
  end
92
89
 
93
90
  # Fetches the event for the next broadcast on a given channel
94
91
  #
95
92
  # @param channel The channel name
96
93
  def scheduled_next(channel)
97
- Poms::Api::JsonClient.get(
98
- Poms::Api::Uris::Schedule.next(config.base_uri, channel),
99
- config.credentials
100
- ).fetch('items').first
94
+ Api::JsonClient.execute(build_request(
95
+ uri: Api::Uris::Schedule.next(config.base_uri, channel)
96
+ )).fetch('items').first
101
97
  end
102
98
 
103
99
  def reset_config
@@ -108,5 +104,9 @@ module Poms
108
104
  @config or raise Errors::NotConfigured
109
105
  end
110
106
 
111
- private_class_method :config
107
+ def build_request(attributes)
108
+ Api::Request.new(attributes.merge(credentials: config.credentials))
109
+ end
110
+
111
+ private_class_method :config, :build_request
112
112
  end
@@ -9,27 +9,25 @@ module Poms
9
9
  module Auth
10
10
  module_function
11
11
 
12
- extend SingleForwardable
13
-
14
- delegate %i(origin secret key) => :@credentials
15
-
16
12
  # @param request The prepared request
17
13
  # @param credentials The Poms API credentials
18
14
  # @param clock Defaults to current time, but can be provided as Time
19
- def sign(request, credentials, clock = Time.now)
20
- @credentials = credentials
15
+ def sign(request, clock = Time.now)
16
+ credentials = request.credentials
21
17
  timestamp = clock.rfc822
22
- message = generate_message(request.uri, timestamp)
23
-
24
- request['Origin'] = origin
25
- request['X-NPO-Date'] = timestamp
26
- request['Authorization'] = "NPO #{key}:#{encrypt(message)}"
27
- request
18
+ message = generate_message(request, timestamp)
19
+ auth = "NPO #{credentials.key}:#{encrypt(credentials.secret, message)}"
20
+
21
+ request.merge(headers: request.headers.merge(
22
+ 'Origin' => credentials.origin,
23
+ 'X-NPO-Date' => timestamp,
24
+ 'Authorization' => auth
25
+ ))
28
26
  end
29
27
 
30
28
  # Create a message for the Authorization header. This is an encrypted
31
29
  # stringconsisting of a message that is hashed with a shared secret.
32
- def encrypt(message)
30
+ def encrypt(secret, message)
33
31
  sha256 = OpenSSL::Digest.new('sha256')
34
32
  digest = OpenSSL::HMAC.digest(sha256, secret, message)
35
33
  Base64.encode64(digest).strip
@@ -39,12 +37,12 @@ module Poms
39
37
  # documentation.
40
38
  # @param uri The Addressable::URI
41
39
  # @param timestamp An rfc822 formatted timestamp
42
- def generate_message(uri, timestamp)
40
+ def generate_message(request, timestamp)
43
41
  [
44
- "origin:#{origin}",
42
+ "origin:#{request.credentials.origin}",
45
43
  "x-npo-date:#{timestamp}",
46
- "uri:#{uri.path}",
47
- params_string(uri.query_values)
44
+ "uri:#{request.uri.path}",
45
+ params_string(request.uri.query_values)
48
46
  ].compact.join(',')
49
47
  end
50
48
 
@@ -11,30 +11,10 @@ module Poms
11
11
  #
12
12
  # @see Poms::Api::Drivers::NetHttp
13
13
  module Client
14
- extend Drivers::NetHttp
15
-
16
14
  module_function
17
15
 
18
- def get(uri, credentials, headers = {})
19
- handle_response(
20
- execute(
21
- Auth.sign(
22
- prepare_get(uri, headers),
23
- credentials
24
- )
25
- )
26
- )
27
- end
28
-
29
- def post(uri, body, credentials, headers = {})
30
- handle_response(
31
- execute(
32
- Auth.sign(
33
- prepare_post(uri, body, headers),
34
- credentials
35
- )
36
- )
37
- )
16
+ def execute(request)
17
+ handle_response(Drivers::NetHttp.execute(Auth.sign(request)))
38
18
  end
39
19
 
40
20
  def handle_response(response)
@@ -45,14 +25,6 @@ module Poms
45
25
  response
46
26
  end
47
27
  end
48
-
49
- def prepare_get(uri, headers = {})
50
- Request.get(uri, nil, headers)
51
- end
52
-
53
- def prepare_post(uri, body, headers = {})
54
- Request.post(uri, body, headers)
55
- end
56
28
  end
57
29
  end
58
30
  end
@@ -23,6 +23,8 @@ module Poms
23
23
  Net::ProtocolError
24
24
  ].freeze
25
25
 
26
+ module_function
27
+
26
28
  def execute(request_description)
27
29
  response = attempt_request(
28
30
  request_description.uri,
@@ -31,8 +33,6 @@ module Poms
31
33
  Response.new(response.code, response.body, response.to_hash)
32
34
  end
33
35
 
34
- private
35
-
36
36
  def attempt_request(uri, request)
37
37
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
38
38
  http.open_timeout = 5
@@ -41,13 +41,13 @@ module Poms
41
41
  end
42
42
  rescue *NET_HTTP_ERRORS => e
43
43
  raise Errors::HttpError,
44
- "An error (#{e.class}) occured while processing your request."
44
+ "An error (#{e.class}) occured while processing your request."
45
45
  end
46
46
 
47
47
  def prepare_request(request_description)
48
48
  request = request_to_net_http_request(request_description)
49
49
  request.body = request_description.body.to_s
50
- request_description.each_header do |key, value|
50
+ request_description.headers.each do |key, value|
51
51
  request[key] = value
52
52
  end
53
53
  request
@@ -63,6 +63,9 @@ module Poms
63
63
  raise ArgumentError, 'can only execute GET or POST requests'
64
64
  end
65
65
  end
66
+
67
+ private_class_method :attempt_request, :prepare_request,
68
+ :request_to_net_http_request
66
69
  end
67
70
  end
68
71
  end
@@ -12,23 +12,12 @@ module Poms
12
12
 
13
13
  module_function
14
14
 
15
- def get(uri, credentials, headers = {})
16
- response = Client.get(
17
- uri,
18
- credentials,
19
- DEFAULT_HEADERS.merge(headers)
15
+ def execute(request)
16
+ request = request.merge(
17
+ body: request.body.to_json,
18
+ headers: DEFAULT_HEADERS.merge(request.headers)
20
19
  )
21
- JSON.parse(response.body)
22
- end
23
-
24
- def post(uri, body, credentials, headers = {})
25
- response = Client.post(
26
- uri,
27
- body.to_json,
28
- credentials,
29
- DEFAULT_HEADERS.merge(headers)
30
- )
31
- JSON.parse(response.body)
20
+ JSON.parse(Client.execute(request).body)
32
21
  end
33
22
  end
34
23
  end
@@ -1,4 +1,5 @@
1
1
  require 'poms/api/json_client'
2
+ require 'poms/api/request'
2
3
 
3
4
  module Poms
4
5
  module Api
@@ -7,23 +8,11 @@ module Poms
7
8
  module PaginationClient
8
9
  module_function
9
10
 
10
- def get(uri, credentials)
11
- execute(uri) do |page_uri|
12
- Api::JsonClient.get(page_uri, credentials)
13
- end
14
- end
15
-
16
- def post(uri, body, credentials)
17
- execute(uri) do |page_uri|
18
- Api::JsonClient.post(page_uri, body, credentials)
19
- end
20
- end
21
-
22
- def execute(uri)
11
+ def execute(request)
23
12
  Enumerator.new do |yielder|
24
- page = Page.new(uri)
13
+ page = Page.new(request.uri)
25
14
  loop do
26
- page.execute { |page_uri| yield page_uri }
15
+ page.execute { |page_uri| client_execute(request, page_uri) }
27
16
  page.items.each { |item| yielder << item }
28
17
  raise StopIteration if page.final?
29
18
  page = page.next_page
@@ -31,6 +20,12 @@ module Poms
31
20
  end.lazy
32
21
  end
33
22
 
23
+ def client_execute(request, page_uri)
24
+ Api::JsonClient.execute(request.merge(uri: page_uri))
25
+ end
26
+
27
+ private_class_method :client_execute
28
+
34
29
  # Keep track of number of items and how many have been retrieved
35
30
  class Page
36
31
  def initialize(uri, offset = 0)
@@ -6,28 +6,32 @@ module Poms
6
6
  # request, representing a combination of an HTTP method, URI, body and
7
7
  # headers.
8
8
  class Request
9
- extend Forwardable
10
- def_delegators :@headers, :[], :[]=
11
- def_delegator :@headers, :each, :each_header
9
+ attr_reader :method, :uri, :credentials, :body, :headers
12
10
 
13
- attr_reader :uri, :body
14
-
15
- def self.get(*args)
16
- new(:get, *args)
11
+ def initialize(
12
+ uri:, method: :get, credentials: nil, body: nil, headers: {}
13
+ )
14
+ @uri = uri
15
+ @method = method.to_sym
16
+ @body = body || ''
17
+ @headers = headers.to_h.freeze
18
+ @credentials = credentials
19
+ validate!
20
+ freeze
17
21
  end
18
22
 
19
- def self.post(*args)
20
- new(:post, *args)
23
+ def merge(new_attributes)
24
+ self.class.new(attributes.merge(new_attributes))
21
25
  end
22
26
 
23
- def initialize(method, uri, body = nil, headers = {})
24
- @method = method.to_sym
25
- unless %i(get post).include?(@method)
26
- raise ArgumentError, 'method should be :get or :post'
27
- end
28
- @uri = uri
29
- @body = body.to_s
30
- @headers = headers.to_h
27
+ def attributes
28
+ {
29
+ method: method,
30
+ uri: uri,
31
+ body: body,
32
+ headers: headers,
33
+ credentials: credentials
34
+ }
31
35
  end
32
36
 
33
37
  def get?
@@ -37,6 +41,14 @@ module Poms
37
41
  def post?
38
42
  @method == :post
39
43
  end
44
+
45
+ private
46
+
47
+ def validate!
48
+ unless %i(get post).include?(@method)
49
+ raise ArgumentError, 'method should be :get or :post'
50
+ end
51
+ end
40
52
  end
41
53
  end
42
54
  end
@@ -9,7 +9,9 @@ module Poms
9
9
  ends_at: 'end'
10
10
  }.freeze
11
11
 
12
- def self.build(options)
12
+ module_function
13
+
14
+ def build(options)
13
15
  return {} if options.empty?
14
16
  all = options.map do |key, value|
15
17
  case key
@@ -22,9 +24,7 @@ module Poms
22
24
  all.reduce(&:deep_merge)
23
25
  end
24
26
 
25
- private_class_method
26
-
27
- def self.time_params(key, value)
27
+ def time_params(key, value)
28
28
  {
29
29
  'searches' => {
30
30
  'sortDates' => {
@@ -33,6 +33,8 @@ module Poms
33
33
  }
34
34
  }
35
35
  end
36
+
37
+ private_class_method :time_params
36
38
  end
37
39
  end
38
40
  end
@@ -46,11 +46,6 @@ module Poms
46
46
  item['mid']
47
47
  end
48
48
 
49
- # Returns the revision from a Poms hash.
50
- def rev(item)
51
- item['_rev'].to_i
52
- end
53
-
54
49
  # Returns an array of odi stream types.
55
50
  # Note: this code is copied from Broadcast and it is assumed it was working
56
51
  # there.
@@ -68,7 +63,7 @@ module Poms
68
63
  def available_until(item)
69
64
  return if item['predictions'].blank?
70
65
  internetvod = item['predictions']
71
- .find { |p| p['platform'] == 'INTERNETVOD' }
66
+ .find { |p| p['platform'] == 'INTERNETVOD' }
72
67
  return unless internetvod
73
68
  Timestamp.to_datetime(internetvod['publishStop'])
74
69
  end
@@ -103,6 +98,18 @@ module Poms
103
98
  Array(item['memberOf'])
104
99
  end
105
100
 
101
+ # Returns the NICAM age rating of the item or ALL if no age rating exists
102
+ def age_rating(item)
103
+ item.fetch('ageRating', 'ALL')
104
+ end
105
+
106
+ # Returns an array containing zero or more content ratings of the item
107
+ # Possible content ratings are:
108
+ # ANGST, DISCRIMINATIE, DRUGS_EN_ALCOHOL, GEWELD, GROF_TAALGEBRUIK and SEKS
109
+ def content_ratings(item)
110
+ item.fetch('contentRatings', [])
111
+ end
112
+
106
113
  # Returns an array of start and end times for the scheduled events for
107
114
  # this item. It returns an empty array if no events are found. You can pass
108
115
  # in a block to filter the events on data that is not returned, like
@@ -1,4 +1,4 @@
1
1
  # The version
2
2
  module Poms
3
- VERSION = '2.1.3'.freeze
3
+ VERSION = '2.2.0'.freeze
4
4
  end
@@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'guard-rspec'
23
23
  spec.add_development_dependency 'guard'
24
24
  spec.add_development_dependency 'rake'
25
- spec.add_development_dependency 'reek'
26
25
  spec.add_development_dependency 'rspec'
27
26
  spec.add_development_dependency 'rubocop-rspec', '~> 1.7.0'
28
27
  spec.add_development_dependency 'rubocop', '~> 0.42.0'
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.1.3
4
+ version: 2.2.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: 2016-11-21 00:00:00.000000000 Z
11
+ date: 2017-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: reek
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rspec
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -217,14 +203,12 @@ files:
217
203
  - ".rubocop.yml"
218
204
  - ".rubocop_todo.yml"
219
205
  - ".ruby-version"
220
- - ".todo.reek"
221
206
  - CHANGELOG.md
222
207
  - Gemfile
223
208
  - Guardfile
224
209
  - LICENSE.txt
225
210
  - README.md
226
211
  - Rakefile
227
- - bin/reek
228
212
  - bin/rspec
229
213
  - bin/rubocop
230
214
  - circle.yml
data/.todo.reek DELETED
@@ -1,52 +0,0 @@
1
- ---
2
- exclude_paths:
3
- - vendor
4
- UncommunicativeVariableName:
5
- exclude:
6
- - Poms::Fields#available_until
7
- - Poms::Fields#odi_streams
8
- - Poms::MergedSeries#serie_mids
9
- - Poms
10
- DuplicateMethodCall:
11
- exclude:
12
- - Poms::Api::Client#handle_response
13
- - Poms::Api::RequestExecution#headers
14
- - Poms::Builderless::Clip#position
15
- - Poms::Builderless::Clip#video_url
16
- - Poms::Field
17
- UtilityFunction:
18
- exclude:
19
- - Poms::Api::RequestExecution#execute_ssl_request
20
- - Poms::Fields
21
- NilCheck:
22
- exclude:
23
- - Poms::Fields#odi_streams
24
- TooManyStatements:
25
- exclude:
26
- - Poms::Fields#odi_streams
27
- - Poms::Api::Auth#sign
28
- - Poms::Api::Drivers::NetHttp#attempt_request
29
- - Poms::Api::PaginationClient#execute
30
- LongParameterList:
31
- exclude:
32
- - Poms::MergedSeries#serie_mids
33
- - Poms::Api::Client#post
34
- - Poms::Api::JsonClient#post
35
- FeatureEnvy:
36
- exclude:
37
- - Poms#first
38
- - Poms::Api::Client#handle_response
39
- - Poms::Api::Drivers::NetHttp#attempt_request
40
- - Poms::Api::Drivers::NetHttp#execute
41
- - Poms::Api::Drivers::NetHttp#prepare_request
42
- - Poms::Api::Drivers::NetHttp#request_to_net_http_request
43
- - Poms::Api::PaginationClient#execute
44
- NestedIterators:
45
- exclude:
46
- - Poms::Api::PaginationClient#execute
47
- Attribute:
48
- exclude:
49
- - Poms::Configuration#base_uri
50
- - Poms::Configuration#key
51
- - Poms::Configuration#secret
52
- - Poms::Configuration#origin
data/bin/reek DELETED
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # This file was generated by Bundler.
4
- #
5
- # The application 'reek' is installed as part of a gem, and
6
- # this file is here to facilitate running it.
7
- #
8
-
9
- require "pathname"
10
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
11
- Pathname.new(__FILE__).realpath)
12
-
13
- require "rubygems"
14
- require "bundler/setup"
15
-
16
- load Gem.bin_path("reek", "reek")