kandianying 0.0.8 → 1.0.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.
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'