poms 2.1.3 → 2.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: 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")