kandianying 0.0.8 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -6
  3. data/README.md +12 -3
  4. data/bin/kandianying +4 -1
  5. data/lib/kandianying/ambassador.rb +3 -2
  6. data/lib/kandianying/ambassador_scrape.rb +21 -15
  7. data/lib/kandianying/version.rb +2 -2
  8. data/lib/kandianying/vieshow.rb +6 -6
  9. data/lib/kandianying/vieshow_scrape.rb +20 -10
  10. data/spec/ambassador_spec.rb +80 -58
  11. data/spec/fixtures/ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6_chinese.yml +6 -0
  12. data/spec/fixtures/{ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6.yml → ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6_english.yml} +2 -0
  13. data/spec/fixtures/ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c_chinese.yml +11 -0
  14. data/spec/fixtures/{ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c.yml → ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c_english.yml} +2 -0
  15. data/spec/fixtures/ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6_chinese.yml +202 -0
  16. data/spec/fixtures/ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6_english.yml +202 -0
  17. data/spec/fixtures/ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c_chinese.yml +371 -0
  18. data/spec/fixtures/ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c_english.yml +371 -0
  19. data/spec/fixtures/vcr_cassettes/{ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6.yml → ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6_chinese.yml} +772 -222
  20. data/spec/fixtures/vcr_cassettes/{ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6.yml → ambassador_name_38897fa9-094f-4e63-9d6d-c52408438cb6_english.yml} +772 -222
  21. data/spec/fixtures/vcr_cassettes/{ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c.yml → ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c_chinese.yml} +1112 -832
  22. data/spec/fixtures/vcr_cassettes/{ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c.yml → ambassador_name_5c2d4697-7f54-4955-800c-7b3ad782582c_english.yml} +1112 -832
  23. data/spec/fixtures/vcr_cassettes/ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6_chinese.yml +2568 -0
  24. data/spec/fixtures/vcr_cassettes/ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6_english.yml +2568 -0
  25. data/spec/fixtures/vcr_cassettes/ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c_chinese.yml +2889 -0
  26. data/spec/fixtures/vcr_cassettes/ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c_english.yml +2889 -0
  27. data/spec/fixtures/vcr_cassettes/vieshow_name_05_chinese.yml +896 -0
  28. data/spec/fixtures/vcr_cassettes/vieshow_name_05_english.yml +521 -0
  29. data/spec/fixtures/vcr_cassettes/vieshow_name_12_chinese.yml +626 -0
  30. data/spec/fixtures/vcr_cassettes/vieshow_name_12_english.yml +370 -0
  31. data/spec/fixtures/vcr_cassettes/vieshow_table_05_chinese.yml +896 -0
  32. data/spec/fixtures/vcr_cassettes/vieshow_table_05_english.yml +521 -0
  33. data/spec/fixtures/vcr_cassettes/vieshow_table_12_chinese.yml +626 -0
  34. data/spec/fixtures/vcr_cassettes/vieshow_table_12_english.yml +370 -0
  35. data/spec/fixtures/vieshow_name_05_chinese.yml +26 -0
  36. data/spec/fixtures/vieshow_name_05_english.yml +26 -0
  37. data/spec/fixtures/vieshow_name_12_chinese.yml +20 -0
  38. data/spec/fixtures/{vieshow_name_12.yml → vieshow_name_12_english.yml} +7 -1
  39. data/spec/fixtures/vieshow_table_05_chinese.yml +881 -0
  40. data/spec/fixtures/vieshow_table_05_english.yml +881 -0
  41. data/spec/fixtures/vieshow_table_12_chinese.yml +629 -0
  42. data/spec/fixtures/vieshow_table_12_english.yml +629 -0
  43. data/spec/support/vcr_setup.rb +4 -0
  44. data/spec/vieshow_spec.rb +86 -68
  45. metadata +67 -35
  46. data/spec/fixtures/ambassador_table_38897fa9-094f-4e63-9d6d-c52408438cb6.yml +0 -131
  47. data/spec/fixtures/ambassador_table_5c2d4697-7f54-4955-800c-7b3ad782582c.yml +0 -304
  48. data/spec/fixtures/vcr_cassettes/vieshow_name_05.yml +0 -298
  49. data/spec/fixtures/vcr_cassettes/vieshow_name_12.yml +0 -245
  50. data/spec/fixtures/vcr_cassettes/vieshow_table_05.yml +0 -298
  51. data/spec/fixtures/vcr_cassettes/vieshow_table_12.yml +0 -245
  52. data/spec/fixtures/vieshow_name_05.yml +0 -17
  53. data/spec/fixtures/vieshow_table_05.yml +0 -458
  54. data/spec/fixtures/vieshow_table_12.yml +0 -356
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d16fe1b8b27ad6f575ed6e12b92e244dd64c4402
4
- data.tar.gz: ac70497b5450250a5d9ad9a5e3c3ad19b0802fe0
3
+ metadata.gz: 3c2b7b9301e9a183bf01b53e8836f917cfaa46b8
4
+ data.tar.gz: 7626e72430864d00b07770361aa7a314a18be371
5
5
  SHA512:
6
- metadata.gz: 6837f76db4416653311efa7dc798e13acb18f54f75a0274c7a6ed91ad1f0dfcba029fcf0871bd01c0f9d40b020ee4310a612a6791a2050cf460726118313d832
7
- data.tar.gz: 4765e731a2c172515b740650bb60338460470dec84b688ab489ff0015f04d81a0a0037db3e987607c745b21085d820964c6559fa62fd8607a0a2b7c995afd4cd
6
+ metadata.gz: 0a1d8102acecabcf895a6e48fd5448d2107accc01ff2d8e6fd3743a0ba1b64597c760beb5195c8cd25ff35bbe12e83437bf922b65b62196093f6852c6b2dcc93
7
+ data.tar.gz: 2632153993af786b284fb34ddfd87104ecec2ea7aa0f985b1fd04c95cc2c2cef18662da6428aac0d03e6fa4011add45f57f52cc790de242954ff6b1576bed89d
@@ -3,12 +3,6 @@ rvm:
3
3
  - ruby-head
4
4
  - 2.2.3
5
5
  - 2.1.0
6
- - 1.9.3
7
- - jruby-head
8
- matrix:
9
- allow_failures:
10
- - rvm: jruby-head
11
- - rvm: 1.9.3
12
6
  notifications:
13
7
  slack: soa-2015:kyVe3CqcC9MHxQdS3y4SyD07
14
8
  # uncomment this line if your project needs to run something other than `rake`:
data/README.md CHANGED
@@ -12,11 +12,14 @@ gem install kandianying
12
12
  ```
13
13
 
14
14
  ### General usage notes
15
- Currently, usage requires specifying a theater_id. This value ranges from 1 to 14. For a cinema located in Hsinchu, use 5 or 12.
15
+ Currently, usage requires specifying a `theater_id` and `language`.
16
+ - For Vieshow cinemas, `theater_id` ranges from 1 to 14. For a cinema located in Hsinchu, use 5 or 12.
17
+ - For Ambassador cinemas, `theater_id codes` are unique. For the Ambassador cinema in Hsinchu, use 38897fa9-094f-4e63-9d6d-c52408438cb6
18
+ - For `language`, this has to be either 'chinese' or 'english'.
16
19
 
17
20
  ### Command line usage
18
21
  ```
19
- kandianying vieshow <theater_id>
22
+ kandianying vieshow <theater_id> # Development deprecated.
20
23
  # This prints out cinema name with films on display and show times.
21
24
  ```
22
25
 
@@ -24,19 +27,25 @@ kandianying vieshow <theater_id>
24
27
  ```
25
28
  require 'kandianying'
26
29
 
27
- vieshow_movie = HsinChuMovie::Vieshow.new(<theater_id>)
30
+ vieshow_movie = HsinChuMovie::Vieshow.new(<theater_id>, <language>)
28
31
  vieshow_movie.movie_names # Returns array of film names
29
32
  vieshow_movie.movie_table # Returns Hash containing film names, dates, times
30
33
  vieshow_movie.to_json # Returns JSON array of movie_table
34
+ ambassador_movie = HsinChuMovie::Ambassador.new(<theater_id>, <language>)
35
+ ambassador_movie.movie_names # Returns array of film names
36
+ ambassador_movie.movie_table # Returns Hash containing film names, dates, times
37
+ ambassador_movie.to_json # Returns JSON array of movie_table
31
38
 
32
39
  # <film_name> is a string that is any part of the name of film.
33
40
  vieshow_movie.film_times(film_name)
41
+ ambassador_movie.film_times(film_name)
34
42
  # Returns Hash containing film viewing dates and times.
35
43
 
36
44
  # <date_time> is string of the type 'MONTH DATE TIME' such as 'November 5 22:00'.
37
45
  # Abbreviations such as 'Nov 5 22:00' would suffice.
38
46
  # If the date is the same as the query date, you can simply use the time '22:00'
39
47
  vieshow_movie.films_after_time(date_time)
48
+ ambassador_movie.films_after_time(date_time)
40
49
  # Returns hash containing films on display after given time with start times
41
50
  ```
42
51
 
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+
3
+ # This is deprecated!
4
+
2
5
  require_relative '../lib/kandianying'
3
6
  VIESHOW_CODES = ('1'..'14').to_a.map { |e| e.length == 1 ? "0#{e}" : e }
4
7
  ID_OUT_OUT_RANGE = 'Please use a cinema code between \'1\' and \'14\' inclusive'
@@ -6,7 +9,7 @@ ID_OUT_OUT_RANGE = 'Please use a cinema code between \'1\' and \'14\' inclusive'
6
9
  if ARGV[0] == 'vieshow'
7
10
  ARGV[1] = "0#{ARGV[1]}" if ARGV[1].length == 1
8
11
  if VIESHOW_CODES.include? ARGV[1]
9
- cinema = HsinChuMovie::Vieshow.new(ARGV[1])
12
+ cinema = HsinChuMovie::Vieshow.new(ARGV[1], 'english')
10
13
  cinema.movie_table.each do |cinema_name, movies|
11
14
  puts cinema_name
12
15
  movies.each do |movie, date_times|
@@ -13,14 +13,15 @@ module Ambassador
13
13
  include AmbassadorScrape, Search
14
14
  attr_reader :movie_table, :theater_id_table, :cinema_name
15
15
 
16
- def initialize(id)
16
+ def initialize(id, language)
17
17
  @movie_table = {}
18
18
  @theater_id_table = fetch_theater_id_table(AMBASSADOR_THEATER_ID_URL)
19
19
  theater_id_table.each do |theater_id, theater_name|
20
20
  next unless theater_id.include? id
21
21
  date_list = fetch_theater_date(theater_id)
22
22
  @cinema_name = theater_name
23
- @movie_table[theater_name] = fetch_movie_info(theater_id, date_list)
23
+ @movie_table[theater_name] = fetch_movie_info(theater_id, date_list,
24
+ language)
24
25
  end
25
26
  end
26
27
 
@@ -4,31 +4,37 @@ module AmbassadorScrape
4
4
  AMBASSADOR_THEATER_ID_XPATH = "//*[@class='list-group sidebar-nav-v1']//li//a"
5
5
  AMBASSADOR_TIME_API = 'http://cinemaservice.ambassador.com.tw/ambassadorsite.webapi/api/Movies/GetScreeningDateListForTheater/?'
6
6
  AMBASSADOR_FILM_API = 'http://cinemaservice.ambassador.com.tw/ambassadorsite.webapi/api/Movies/GetShowtimeListForTheater/?'
7
+ PICK_LANGUAGE = { 'chinese' => 'Name', 'english' => 'ForeignName' }
8
+ PERIOD_SHOW_TIME = 'PeriodShowtime'
9
+ SHOW_TIMES = 'Showtimes'
7
10
 
8
- def fetch_movie_info(theater_id, date_list)
11
+ def fetch_movie_info(theater_id, date_list, language)
12
+ language = PICK_LANGUAGE[language]
9
13
  movie_info = Hash.new { |hash, key| hash[key] = {} }
10
14
  date_list.map do |date|
11
15
  url = "#{AMBASSADOR_FILM_API}theaterId=#{theater_id}&showingDate=#{date}"
12
- # concurrent_retrieve_info(url, date, movie_info)
13
- JSON.parse(Nokogiri::HTML(open(url)).text).map do |movie|
14
- name = movie['ForeignName']
15
- time = movie['PeriodShowtime'].first['Showtimes']
16
+ JSON.parse(open(url).read).map do |movie|
17
+ name, time = *name_time(movie, language)
16
18
  movie_info[name][date] = time
17
- end
18
- end # .map(&:execute).map(&:value)
19
+ end; end # .map(&:execute).map(&:value)
19
20
  movie_info # .sort.to_h
20
21
  end
21
22
 
22
- def concurrent_retrieve_info(url, date, movie_info)
23
- Concurrent::Future.new do
24
- JSON.parse(Nokogiri::HTML(open(url)).text).map do |movie|
25
- name = movie['ForeignName']
26
- time = movie['PeriodShowtime'].first['Showtimes']
27
- movie_info[name][date] = time
28
- end
29
- end
23
+ def name_time(movie, language)
24
+ movie = movie
25
+ [movie[language], movie[PERIOD_SHOW_TIME].first[SHOW_TIMES]]
30
26
  end
31
27
 
28
+ # def concurrent_retrieve_info(url, date, movie_info)
29
+ # Concurrent::Future.new do
30
+ # JSON.parse(Nokogiri::HTML(open(url)).text).map do |movie|
31
+ # name = movie['ForeignName']
32
+ # time = movie['PeriodShowtime'].first['Showtimes']
33
+ # movie_info[name][date] = time
34
+ # end
35
+ # end
36
+ # end
37
+
32
38
  def fetch_theater_date(theater_id)
33
39
  url = "#{AMBASSADOR_TIME_API}theaterId=#{theater_id}"
34
40
  JSON.parse(Nokogiri::HTML(open(url)).text)
@@ -1,5 +1,5 @@
1
1
  # Versioning
2
2
  module KanDianYing
3
- VERSION = '0.0.8'
4
- DATE = '2015-11-14'
3
+ VERSION = '1.0.0'
4
+ DATE = '2015-11-19'
5
5
  end
@@ -7,20 +7,20 @@ require_relative './search'
7
7
  # Scraper for VieShow
8
8
  module VieShow
9
9
  INITIALIZE_ERROR = 'id out of range'
10
+ LANGUAGE_ERROR = 'language must be one of \'english\' or \'chinese\''
10
11
 
11
12
  # Class for Vieshow films
12
13
  class Vieshow
13
14
  include VieshowScrape, Search
14
15
  # initialize movie_table with ID
15
- def initialize(vis_cinema_id)
16
+ def initialize(vis_cinema_id, langauge)
16
17
  vis_cinema_id = vis_cinema_id.to_s
17
18
  vis_cinema_id = "0#{vis_cinema_id}" if vis_cinema_id.length == 1
18
19
  fail INITIALIZE_ERROR unless VIESHOW_CINEMA_CODES.include? vis_cinema_id
19
- doc = visit_vieshow(vis_cinema_id)
20
- @table = doc.xpath(VIESHOW_FULL_XPATH)
21
- @cinema_name = doc.xpath(VIESHOW_CINEMA_NAME_XPATH).text
22
- @movie_table = Hash.new { |hash, key| hash[key] = [] }
23
- make_movie_table
20
+ fail LANGUAGE_ERROR unless PICK_LANGUAGE.keys.include? langauge
21
+ doc = visit_vieshow(vis_cinema_id, langauge)
22
+ @table, @cinema_name = initiatilize_table_cinema_name(doc)
23
+ make_movie_table(langauge)
24
24
  @movie_table = { @cinema_name => @movie_table }
25
25
  end
26
26
 
@@ -3,7 +3,7 @@ module VieshowScrape
3
3
  VIESHOW_URL = 'http://sales.vscinemas.com.tw/ticketing/visPrintShowTimes'\
4
4
  '.aspx?visCinemaID=00'
5
5
  LANGUAGE_PARAM = '&visLang='
6
- LANGUAGES = %w(1, 2)
6
+ PICK_LANGUAGE = { 'english' => '1', 'chinese' => '2' }
7
7
  VIESHOW_COOKIE_SETTINGS = 'AspxAutoDetectCookieSupport=1'
8
8
  VIESHOW_BASE_XPATH = 'PrintShowTimes'
9
9
  VIESHOW_CLASSES_XPATH = %w(Film Day Session)
@@ -17,30 +17,40 @@ module VieshowScrape
17
17
  end
18
18
  VIESHOW_CINEMA_NAME_XPATH = "//*[contains(@class, 'PrintCinemaName')]"
19
19
 
20
- def visit_vieshow(vis_cinema_id)
21
- # Include langauge settings in morning when film data is stable.
22
- # Add an extra parameter to this method
23
- url = VIESHOW_URL + vis_cinema_id
24
- open_doc = open(url, 'Cookie' => VIESHOW_COOKIE_SETTINGS)
20
+ def visit_vieshow(vis_cinema_id, language)
21
+ url = VIESHOW_URL + vis_cinema_id + LANGUAGE_PARAM + PICK_LANGUAGE[language]
22
+ open_doc = open(url, 'Cookie' => VIESHOW_COOKIE_SETTINGS).read
25
23
  Nokogiri::HTML(open_doc)
26
24
  end
27
25
 
28
26
  # make movie_table like the structure {"name"=>[[day,time],"name2".....}
29
- def make_movie_table
27
+ def make_movie_table(langauge)
28
+ @movie_table = Hash.new { |hash, key| hash[key] = [] }
30
29
  current_movie = ''
31
30
  @table.each do |td|
32
- current_movie = movie_conditions(td, current_movie)
31
+ current_movie = movie_conditions(td, current_movie, langauge)
33
32
  end
34
33
  @movie_table.each { |k, v| movie_table[k] = v.to_h }
35
34
  end
36
35
 
36
+ def make_chinese_dates_english(text, langauge)
37
+ return [text] unless langauge == 'chinese'
38
+ text = text.split.map { |x| x[/\d+/] }.compact if langauge == 'chinese'
39
+ [text.join('/')]
40
+ end
41
+
42
+ def initiatilize_table_cinema_name(doc)
43
+ [doc.xpath(VIESHOW_FULL_XPATH), doc.xpath(VIESHOW_CINEMA_NAME_XPATH).text]
44
+ end
45
+
37
46
  # make make_movie_table simple
38
- def movie_conditions(td, current_movie)
47
+ def movie_conditions(td, current_movie, langauge)
39
48
  case td.first[1]
40
49
  when 'PrintShowTimesFilm'
41
50
  current_movie = td.text
42
51
  when 'PrintShowTimesDay'
43
- @movie_table[current_movie] << [td.text]
52
+ date_in_array = make_chinese_dates_english(td.text, langauge)
53
+ @movie_table[current_movie] << date_in_array
44
54
  when 'PrintShowTimesSession'
45
55
  @movie_table[current_movie][-1] << td.text.split(', ')
46
56
  end
@@ -3,74 +3,96 @@ require './spec/support/vcr_setup'
3
3
  AMBASSADOR_TEST_SITES = %w(38897fa9-094f-4e63-9d6d-c52408438cb6
4
4
  5c2d4697-7f54-4955-800c-7b3ad782582c)
5
5
  # FAIL_SITES = %w(0 16)
6
- AMBASSADOR_FIXTURES = './spec/fixtures/ambassador_'
6
+ AMB_FIXTURES = './spec/fixtures/ambassador_'
7
7
 
8
8
  describe 'Get film information' do
9
9
  AMBASSADOR_TEST_SITES.each do |site|
10
- it "must return same list of movies for #{site}" do
11
- VCR.use_cassette("ambassador_name_#{site}") do
12
- cinema = HsinChuMovie::Ambassador.new site
13
- site_names = yml_load("#{AMBASSADOR_FIXTURES}name_#{site}.yml")
14
- site_names.must_equal cinema.movie_names
10
+ LANGUAGE.each do |lang|
11
+ it "must return same list of movies for #{site} for #{lang}" do
12
+ VCR.use_cassette("ambassador_name_#{site}_#{lang}") do
13
+ cinema = HsinChuMovie::Ambassador.new(site, lang)
14
+ site_names = yml_load("#{AMB_FIXTURES}name_#{site}_#{lang}.yml")
15
+ site_names.must_equal cinema.movie_names
16
+ end
15
17
  end
16
- end
17
18
 
18
- it "must return same table for #{site}" do
19
- VCR.use_cassette("ambassador_table_#{site}") do
20
- cinema = HsinChuMovie::Ambassador.new site
21
- site_table = yml_load("#{AMBASSADOR_FIXTURES}table_#{site}.yml")
22
- site_table.must_equal cinema.movie_table
23
- end
24
- end
19
+ it "must return same table for #{site} for #{lang}" do
20
+ VCR.use_cassette("ambassador_table_#{site}_#{lang}") do
21
+ cinema = HsinChuMovie::Ambassador.new(site, lang)
22
+ site_table = yml_load("#{AMB_FIXTURES}table_#{site}_#{lang}.yml")
23
+ site_table.must_equal cinema.movie_table
24
+ end; end; end
25
25
  end
26
26
  end
27
27
 
28
- describe 'Get films after a given time on given day' do
28
+ describe 'Get show times for a film' do
29
29
  AMBASSADOR_TEST_SITES.each do |site|
30
- it "should only return films after a time for #{site}" do
31
- VCR.use_cassette("ambassador_table_#{site}") do
32
- cinema = HsinChuMovie::Ambassador.new site
33
- time = DateTime.now.new_offset(TAIWAN_TIME)
34
- time += GIVEN_DAY.sample
35
- time_s = time.to_s
36
- time_s[SEC_PART] = ZERO_SEC
37
- day_films = cinema.films_on_day(time_s)
38
- after_films = cinema.films_after_time(time_s)
39
- # comparison_time is an hour earlier than specified time
40
- comparison_time = (time - AN_HOUR).to_s[HOUR_MIN]
41
- day_films.each do |film, date_times|
42
- date_times.each do |date, show_times|
43
- if after_films[film].nil?
44
- # If empty, all show times must be less than comparison time
45
- show_times.each do |show_time|
46
- show_time.must_be :<, comparison_time
47
- end
48
- else
49
- after_show_times = after_films[film][date]
50
- after_show_times.each do |ast|
51
- # On day show times must include after request show times
52
- show_times.must_include ast
53
- # After show times must be greater than comparison time
54
- if (ast < comparison_time) &&
55
- (MIDNIGHT.include? ast[HOUR_PART])
56
- # Movies airing from midnight onwards are group with past day
57
- ast[HOUR_PART] = "#{ast[HOUR_PART].to_i + ADD_24}"
58
- end
59
- ast.must_be :>=, comparison_time
60
- end
61
- show_times -= after_films[film][date]
62
- # Any show time not returned must be less than comparison time
63
- show_times.each do |show_time|
64
- show_time.must_be :<, comparison_time
65
- end
30
+ LANGUAGE.each do |lang|
31
+ it "should get viewing times for this film in #{lang}" do
32
+ VCR.use_cassette("ambassador_table_#{site}_#{lang}") do
33
+ cinema = HsinChuMovie::Ambassador.new(site, lang)
34
+ one_movie = yml_load("#{AMB_FIXTURES}name_#{site}_#{lang}.yml").sample
35
+ # Films are saved as UPPERCASE but search should pass any case
36
+ cinema.film_times(one_movie.downcase).each do |film, date_times|
37
+ film.must_include one_movie
38
+ date_times.keys.each do |date|
39
+ nums_in_date = date.split('/')
40
+ MONTH_NUM.must_include nums_in_date[1]
41
+ DATE_NUM.must_include nums_in_date.last
42
+ # words_in_date = date.split
43
+ # MONTHS.must_include words_in_date.first
44
+ # DAYS.must_include words_in_date.last
66
45
  end; end; end; end; end
67
46
  end
47
+ AMBASSADOR_TEST_SITES.each do |site|
48
+ LANGUAGE.each do |lang|
49
+ it 'should return empty array for random string' do
50
+ VCR.use_cassette("ambassador_table_#{site}_#{lang}") do
51
+ cinema = HsinChuMovie::Ambassador.new(site, lang)
52
+ cinema.film_times(RANDOM_STRING).must_be_empty
53
+ end; end; end
54
+ end
68
55
  end
69
56
 
70
- # describe 'Outside of 1 and 14 must fail' do
71
- # FAIL_SITES.each do |site|
72
- # it "must fail for #{site}" do
73
- # # HsinChuMovie::Vieshow.new(site.to_i).must_fail
74
- # end
75
- # end
76
- # end
57
+ describe 'Get films after a given time on given day' do
58
+ AMBASSADOR_TEST_SITES.each do |site|
59
+ LANGUAGE.each do |lang|
60
+ it "should only return films after a time for #{site} for #{lang}" do
61
+ VCR.use_cassette("ambassador_table_#{site}_#{lang}") do
62
+ cinema = HsinChuMovie::Ambassador.new(site, lang)
63
+ time = DateTime.now.new_offset(TAIWAN_TIME)
64
+ time += GIVEN_DAY.sample
65
+ time_s = time.to_s
66
+ time_s[SEC_PART] = ZERO_SEC
67
+ day_films = cinema.films_on_day(time_s)
68
+ after_films = cinema.films_after_time(time_s)
69
+ # comparison_time is an hour earlier than specified time
70
+ comparison_time = (time - AN_HOUR).to_s[HOUR_MIN]
71
+ day_films.each do |film, date_times|
72
+ date_times.each do |date, show_times|
73
+ if after_films[film].nil?
74
+ # If empty, all show times must be less than comparison time
75
+ show_times.each do |show_time|
76
+ show_time.must_be :<, comparison_time
77
+ end
78
+ else
79
+ after_show_times = after_films[film][date]
80
+ after_show_times.each do |ast|
81
+ # On day show times must include after request show times
82
+ show_times.must_include ast
83
+ # After show times must be greater than comparison time
84
+ if (ast < comparison_time) &&
85
+ (MIDNIGHT.include? ast[HOUR_PART])
86
+ # Movies airing from midnight onwards are grouped w/past day
87
+ ast[HOUR_PART] = "#{ast[HOUR_PART].to_i + ADD_24}"
88
+ end
89
+ ast.must_be :>=, comparison_time
90
+ end
91
+ show_times -= after_films[film][date]
92
+ # Any show time not returned must be less than comparison time
93
+ show_times.each do |show_time|
94
+ show_time.must_be :<, comparison_time
95
+ end
96
+ end; end; end; end; end; end
97
+ end
98
+ end
@@ -0,0 +1,6 @@
1
+ ---
2
+ - 殭屍教戰守則
3
+ - 007惡魔四伏
4
+ - 小王子
5
+ - 危機女王[口碑場]
6
+ - STAR WARS:原力覺醒
@@ -2,3 +2,5 @@
2
2
  - SCOUTS GUIDE TO THE ZOMBIE APOCALYPSE
3
3
  - Spectre
4
4
  - The Little Prince
5
+ - Our Brand Is Crisis
6
+ - STAR WARS:The Force Awakens
@@ -0,0 +1,11 @@
1
+ ---
2
+ - 殭屍教戰守則
3
+ - 剩者為王
4
+ - 關鍵救援:巴士657
5
+ - 007惡魔四伏
6
+ - 天菜大廚
7
+ - 小王子
8
+ - 高年級實習生
9
+ - 飢餓遊戲:自由幻夢終結戰
10
+ - 危機女王[口碑場]
11
+ - STAR WARS:原力覺醒
@@ -7,3 +7,5 @@
7
7
  - The Little Prince
8
8
  - THE INTERN
9
9
  - 'The Hunger Games: Mockingjay - Part 2'
10
+ - Our Brand Is Crisis
11
+ - STAR WARS:The Force Awakens
@@ -0,0 +1,202 @@
1
+ ---
2
+ 國賓影城@新竹環球世博店:
3
+ 殭屍教戰守則:
4
+ 2015/11/19:
5
+ - '12:00'
6
+ - '13:50'
7
+ - '15:40'
8
+ - '17:30'
9
+ - '19:20'
10
+ - '21:10'
11
+ 2015/11/20:
12
+ - '11:40'
13
+ - '13:30'
14
+ - '17:20'
15
+ - '21:30'
16
+ 2015/11/21:
17
+ - '10:20'
18
+ - '12:50'
19
+ - '16:40'
20
+ - '20:30'
21
+ 2015/11/22:
22
+ - '10:20'
23
+ - '12:50'
24
+ - '16:40'
25
+ - '20:30'
26
+ 2015/11/23:
27
+ - '11:40'
28
+ - '14:10'
29
+ - '16:00'
30
+ - '17:50'
31
+ - '19:40'
32
+ - '21:30'
33
+ 2015/11/24:
34
+ - '11:40'
35
+ - '14:10'
36
+ - '16:00'
37
+ - '17:50'
38
+ - '19:40'
39
+ - '21:30'
40
+ 2015/11/25:
41
+ - '11:40'
42
+ - '14:10'
43
+ - '16:00'
44
+ - '17:50'
45
+ - '19:40'
46
+ - '21:30'
47
+ 2015/11/26:
48
+ - '11:40'
49
+ - '14:10'
50
+ - '16:00'
51
+ - '17:50'
52
+ - '19:40'
53
+ - '21:30'
54
+ 007惡魔四伏:
55
+ 2015/11/19:
56
+ - '11:30'
57
+ - '12:30'
58
+ - '14:10'
59
+ - '15:10'
60
+ - '16:20'
61
+ - '17:50'
62
+ - '18:50'
63
+ - '20:30'
64
+ - '21:30'
65
+ 2015/11/20:
66
+ - '12:20'
67
+ - '13:30'
68
+ - '15:00'
69
+ - '16:10'
70
+ - '17:40'
71
+ - '18:50'
72
+ - '20:20'
73
+ - '21:10'
74
+ 2015/11/21:
75
+ - '10:20'
76
+ - '12:10'
77
+ - '14:50'
78
+ - '16:10'
79
+ - '17:30'
80
+ - '18:50'
81
+ - '20:10'
82
+ - '21:30'
83
+ 2015/11/22:
84
+ - '10:40'
85
+ - '12:10'
86
+ - '13:20'
87
+ - '14:50'
88
+ - '16:00'
89
+ - '17:30'
90
+ - '18:40'
91
+ - '20:10'
92
+ - '21:20'
93
+ 2015/11/23:
94
+ - '11:30'
95
+ - '12:20'
96
+ - '13:30'
97
+ - '15:00'
98
+ - '16:10'
99
+ - '17:40'
100
+ - '18:50'
101
+ - '20:20'
102
+ - '21:30'
103
+ 2015/11/24:
104
+ - '11:30'
105
+ - '12:20'
106
+ - '13:30'
107
+ - '15:00'
108
+ - '16:10'
109
+ - '17:40'
110
+ - '18:50'
111
+ - '20:20'
112
+ - '21:30'
113
+ 2015/11/25:
114
+ - '11:30'
115
+ - '12:20'
116
+ - '13:30'
117
+ - '15:00'
118
+ - '16:10'
119
+ - '17:40'
120
+ - '18:50'
121
+ - '20:20'
122
+ - '21:30'
123
+ 2015/11/26:
124
+ - '11:30'
125
+ - '12:20'
126
+ - '13:30'
127
+ - '15:00'
128
+ - '16:10'
129
+ - '17:40'
130
+ - '18:50'
131
+ - '20:20'
132
+ - '21:30'
133
+ 小王子:
134
+ 2015/11/19:
135
+ - '12:20'
136
+ - '16:50'
137
+ 2015/11/20:
138
+ - '11:30'
139
+ - '13:30'
140
+ - '17:30'
141
+ 2015/11/21:
142
+ - '11:00'
143
+ - '13:00'
144
+ - '17:00'
145
+ 2015/11/22:
146
+ - '11:00'
147
+ - '13:00'
148
+ - '17:00'
149
+ 2015/11/23:
150
+ - '11:30'
151
+ - '13:30'
152
+ - '17:30'
153
+ 2015/11/24:
154
+ - '11:30'
155
+ - '13:30'
156
+ - '17:30'
157
+ 2015/11/25:
158
+ - '11:30'
159
+ - '13:30'
160
+ - '17:30'
161
+ 2015/11/26:
162
+ - '11:30'
163
+ - '13:30'
164
+ - '17:30'
165
+ 危機女王[口碑場]:
166
+ 2015/11/20:
167
+ - '11:30'
168
+ - '15:20'
169
+ - '19:10'
170
+ 2015/11/21:
171
+ - '10:50'
172
+ - '14:40'
173
+ - '18:30'
174
+ 2015/11/22:
175
+ - '10:50'
176
+ - '14:40'
177
+ - '18:30'
178
+ STAR WARS:原力覺醒:
179
+ 2015/12/17:
180
+ - '11:30'
181
+ - '14:00'
182
+ - '16:30'
183
+ - '19:00'
184
+ - '21:30'
185
+ 2015/12/18:
186
+ - '11:30'
187
+ - '14:00'
188
+ - '16:30'
189
+ - '19:00'
190
+ - '21:30'
191
+ 2015/12/19:
192
+ - '10:20'
193
+ - '12:50'
194
+ - '15:20'
195
+ - '17:50'
196
+ - '20:20'
197
+ 2015/12/20:
198
+ - '10:20'
199
+ - '12:50'
200
+ - '15:20'
201
+ - '17:50'
202
+ - '20:20'