odeon_uk 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmYxYzliYzA4OTE4ODMzNWRkYjU2ZGM1ZGJhOGYzOGNhZWMwMGM5Mw==
5
+ data.tar.gz: !binary |-
6
+ ODMwZWU5MThmYmI4ZTA0MzI3ZGUzMmNkNDVjZWY0YTAyOWVhM2YyZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ODY3NmEyM2U3OTY3ZjM1OWFlYmYwYWYzYjEzMjg4MWI4NjFiNDRhNjMzYTY3
10
+ ODBhYmI5NDY0ODRhNzk2MjE2NzkwOGE3YTE4MjA4M2Y3YzBjMTJmMTczNDAy
11
+ MmVmNmEyNDEwNDNkNTRmNmVkZWQwYWQyY2IyYzYxNWFmZDIxM2U=
12
+ data.tar.gz: !binary |-
13
+ YjhmNmMxYjRlZTBiZmEyY2FiNzdlYjEwMDllYmUzZmFmOWQwNGMzMDIwMzVm
14
+ ZGY5MzJlNzkzNDUyYzc5NGM0NDJiMzQ1NzRiYzFiNWYwN2UyZTMzZTI0ZTRk
15
+ ZGNjM2RhOGFjNGQ0MzdmZTM1MDBmZmNlZGNhMWM4Yjk4YmQ2Mzc=
data/.rdoc_options ADDED
@@ -0,0 +1,16 @@
1
+ --- !ruby/object:RDoc::Options
2
+ encoding: UTF-8
3
+ static_path: []
4
+ rdoc_include:
5
+ - .
6
+ charset: UTF-8
7
+ exclude:
8
+ hyperlink_all: false
9
+ line_numbers: false
10
+ main_page:
11
+ markup: tomdoc
12
+ show_hash: false
13
+ tab_width: 8
14
+ title:
15
+ visibility: :protected
16
+ webcvs:
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # OdeonUk
2
2
 
3
- A simple gem to parse the (Odeon UK website)[http://odeon.co.uk] and spit out useful formatted info.
3
+ A simple gem to parse the [Odeon UK website](http://odeon.co.uk) and spit out useful formatted info.
4
4
 
5
5
  [![Code Climate](https://codeclimate.com/github/andycroll/odeon_uk.png)](https://codeclimate.com/github/andycroll/odeon_uk)
6
+ [![Build Status](https://travis-ci.org/andycroll/odeon_uk.png?branch=master)](https://travis-ci.org/andycroll/odeon_uk)
6
7
 
7
8
  ## Installation
8
9
 
@@ -22,8 +22,8 @@ module OdeonUk
22
22
  def initialize(id, name, url)
23
23
  @brand = 'Odeon'
24
24
  @id = id.to_i
25
- @name = name
26
- @slug = name.downcase.gsub(/[^0-9a-z ]/,'').gsub(/\s+/, '-')
25
+ @name = name.gsub('London - ','')
26
+ @slug = @name.downcase.gsub(/[^0-9a-z ]/,'').gsub(/\s+/, '-')
27
27
  @url = (url[0] == '/') ? "http://www.odeon.co.uk#{url}" : url
28
28
  end
29
29
 
@@ -59,6 +59,27 @@ module OdeonUk
59
59
  all.select { |cinema| cinema.id == id }[0]
60
60
  end
61
61
 
62
+ # Public: Returns adress hash of an Odeon cinema
63
+ #
64
+ # Examples
65
+ #
66
+ # cinema = OdeonUk::Cinema.find('71')
67
+ # cinema.adr
68
+ # # => { street_address: 'Kingswest',
69
+ # locality: 'Brighton',
70
+ # postal_code: 'BN1 2RE',
71
+ # country_name: 'United Kingdom' }
72
+ #
73
+ # Returns an array of strings or nil
74
+ def adr
75
+ {
76
+ street_address: street_address,
77
+ locality: locality,
78
+ postal_code: postal_code,
79
+ country: 'United Kingdom'
80
+ }
81
+ end
82
+
62
83
  # Public: Returns films for an Odeon cinema
63
84
  #
64
85
  # Examples
@@ -72,7 +93,34 @@ module OdeonUk
72
93
  film_nodes.map do |node|
73
94
  parser = OdeonUk::Internal::FilmWithScreeningsParser.new node.to_s
74
95
  OdeonUk::Film.new parser.film_name
75
- end
96
+ end.uniq
97
+ end
98
+
99
+ # Public: Returns the locality (town) of an Odeon cinema
100
+ #
101
+ # Examples
102
+ #
103
+ # cinema = OdeonUk::Cinema.find('71')
104
+ # cinema.locality
105
+ # # => 'Brighton'
106
+ #
107
+ # Returns a String
108
+ def locality
109
+ address_node.text.match(/\w+(\s\w+){0,}\s+(\w+(\s\w+){0,})/)[2]
110
+ end
111
+
112
+
113
+ # Public: Returns the postal code of an Odeon cinema
114
+ #
115
+ # Examples
116
+ #
117
+ # cinema = OdeonUk::Cinema.find('71')
118
+ # cinema.postal_code
119
+ # # => 'BN1 2RE'
120
+ #
121
+ # Returns a String
122
+ def postal_code
123
+ address_node.text.match(/[A-Z]{1,2}\d{1,2}[A-Z]?\s\d{1,2}[A-Z]{1,2}/)[0]
76
124
  end
77
125
 
78
126
  # Public: Returns screenings for an Odeon cinema
@@ -87,9 +135,9 @@ module OdeonUk
87
135
  def screenings
88
136
  film_nodes.map do |node|
89
137
  parser = OdeonUk::Internal::FilmWithScreeningsParser.new node.to_s
90
- parser.showings.map do |screening_type, times|
91
- times.map do |time|
92
- OdeonUk::Screening.new parser.film_name, self.name, time.strftime('%d/%m/%Y'), time.strftime('%H:%M:%S'), nil
138
+ parser.showings.map do |screening_type, times_urls|
139
+ times_urls.map do |array|
140
+ OdeonUk::Screening.new parser.film_name, self.name, array[0], array[1], screening_type
93
141
  end
94
142
  end
95
143
  end.flatten
@@ -111,6 +159,19 @@ module OdeonUk
111
159
  screenings.select { |s| s.film_name == film_name }
112
160
  end
113
161
 
162
+ # Public: Returns the street adress of an Odeon cinema
163
+ #
164
+ # Examples
165
+ #
166
+ # cinema = OdeonUk::Cinema.find('71')
167
+ # cinema.street_address
168
+ # # => 'Kingswest'
169
+ #
170
+ # Returns a String
171
+ def street_address
172
+ address_node.text.match(/\A\s+(\w+(\s\w+){0,})/)[1]
173
+ end
174
+
114
175
  private
115
176
 
116
177
  def self.cinema_links
@@ -133,10 +194,18 @@ module OdeonUk
133
194
  @sitemap_response ||= HTTParty.get('http://www.odeon.co.uk/sitemap/')
134
195
  end
135
196
 
197
+ def address_node
198
+ parsed_cinema.css('.gethere .span4 .description')[0]
199
+ end
200
+
136
201
  def cinema_response
137
202
  @cinema_response ||= HTTParty.get(@url)
138
203
  end
139
204
 
205
+ def parsed_cinema
206
+ Nokogiri::HTML(cinema_response)
207
+ end
208
+
140
209
  def film_nodes
141
210
  parsed_showtimes.css('.film-detail')
142
211
  end
data/lib/odeon_uk/film.rb CHANGED
@@ -2,17 +2,51 @@ module OdeonUk
2
2
 
3
3
  # Public: The object representing a film on the Odeon UK website
4
4
  class Film
5
+ include Comparable
5
6
 
6
7
  # Public: Returns the String name of the film
7
8
  attr_reader :name
9
+ # Public: Returns the String slug of the film
10
+ attr_reader :slug
8
11
 
9
12
  # Public: Initialize a screening
10
13
  #
11
14
  # name - String of the film name
12
15
  def initialize(name)
13
16
  @name = name
17
+ @slug = name.downcase.gsub(/[^0-9a-z ]/,'').gsub(/\s+/, '-')
14
18
  end
15
19
 
16
- end
20
+ # Public: Allows sort on objects
21
+ def <=> other
22
+ self.slug <=> other.slug
23
+ end
17
24
 
25
+ # Public: Check an object is the same as another object.
26
+ #
27
+ # True if both objects are the same exact object, or if they are of the same
28
+ # type and share an equal slug
29
+ #
30
+ # Guided by http://woss.name/2011/01/20/equality-comparison-and-ordering-in-ruby/
31
+ #
32
+ # object - object to be compared
33
+ #
34
+ # Returns Boolean
35
+ def eql? other
36
+ self.class == other.class && self == other
37
+ end
38
+
39
+ # Public: generates hash of slug in order to allow two records of the same
40
+ # type and id to work with something like:
41
+ #
42
+ # [ Film.new('ABC'), Film.new('DEF') ] & [ Film.new('DEF'), Film.new('GHI') ]
43
+ # #=> [ Film.new('DEF') ]
44
+ #
45
+ # Guided by http://woss.name/2011/01/20/equality-comparison-and-ordering-in-ruby/
46
+ #
47
+ # Returns an Integer hash of the slug
48
+ def hash
49
+ self.slug.hash
50
+ end
51
+ end
18
52
  end
@@ -39,11 +39,14 @@ module OdeonUk
39
39
  @nokogiri_html.css('.times-all.accordion-group').inject({}) do |result, varient_node|
40
40
  varient = varient_node.css('.tech a').text.gsub('in ', '').upcase
41
41
 
42
- times = varient_node.css('.performance-detail').map do |screening_node|
43
- tz.local_to_utc(Time.parse(screening_node['title'].match(/\d+\/\d+\/\d+ \d{2}\:\d{2}/).to_s))
42
+ times_url = varient_node.css('.performance-detail').map do |screening_node|
43
+ [
44
+ tz.local_to_utc(Time.parse(screening_node['title'].match(/\d+\/\d+\/\d+ \d{2}\:\d{2}/).to_s)),
45
+ "http://www.odeon.co.uk#{screening_node['href']}"
46
+ ]
44
47
  end
45
48
 
46
- result.merge(varient => times)
49
+ result.merge(varient => times_url)
47
50
  end
48
51
  end
49
52
  end
@@ -3,6 +3,8 @@ module OdeonUk
3
3
  # Public: The object representing a screening of a film on the Odeon UK website
4
4
  class Screening
5
5
 
6
+ # Public: Returns the booking URL on the cinema website
7
+ attr_reader :booking_url
6
8
  # Public: Returns the String name of the cinema
7
9
  attr_reader :cinema_name
8
10
  # Public: Returns the String name of the film
@@ -16,12 +18,12 @@ module OdeonUk
16
18
  #
17
19
  # film_name - String of the film name
18
20
  # cinema_name - String of the cinema name on the Odeon website
19
- # date - String/Date representing the date of the screening
20
- # time - String representing the time of the screening (24 hour clock)
21
+ # time - Time representing the time of the screening (24 hour clock)
21
22
  # varient - String representing the type of showing (e.g. 3d/baby/live)
22
- def initialize(film_name, cinema_name, date, time, varient=nil)
23
+ def initialize(film_name, cinema_name, time, booking_url=nil, varient=nil)
23
24
  @cinema_name, @film_name, @varient = cinema_name, film_name, varient
24
- @when = Time.parse("#{date} #{time} UTC")
25
+ @booking_url = booking_url
26
+ @when = time.utc? ? time : TZInfo::Timezone.get('Europe/London').local_to_utc(time)
25
27
  end
26
28
 
27
29
  # Public: The Date of the screening
@@ -1,3 +1,3 @@
1
1
  module OdeonUk
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/odeon_uk.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'httparty'
2
2
  require 'nokogiri'
3
3
  require 'tzinfo'
4
- require 'pp'
4
+ require 'tzinfo/data'
5
5
 
6
- require_relative './odeon_uk/internal/film_with_screenings_parser'
7
6
  require_relative './odeon_uk/version'
7
+
8
+ require_relative './odeon_uk/internal/film_with_screenings_parser'
9
+
8
10
  require_relative './odeon_uk/cinema'
9
11
  require_relative './odeon_uk/film'
10
12
  require_relative './odeon_uk/screening'
data/odeon_uk.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.name = "odeon_uk"
8
8
  gem.version = OdeonUk::VERSION
9
9
  gem.authors = ["Andy Croll"]
10
- gem.email = ["andycroll@deepcalm.com"]
10
+ gem.email = ["andy@goodscary.com"]
11
11
  gem.description = %q{An API to pull movie information from the ODEON.co.uk website}
12
12
  gem.summary = %q{It's a scraper, but a nice one}
13
13
  gem.homepage = "http://github.com/andycroll/odeon_uk"