echelon 0.0.2 → 0.0.3
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.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +31 -0
- data/Rakefile +2 -24
- data/echelon.gemspec +27 -0
- data/lib/echelon/park.rb +24 -0
- data/lib/echelon/parks/disneyland_paris.rb +103 -0
- data/lib/echelon/parks/thorpe_park.rb +62 -0
- data/lib/echelon/version.rb +3 -0
- data/lib/echelon.rb +4 -3
- data/spec/disneyland_paris_spec.rb +34 -0
- data/spec/echelon_spec.rb +54 -0
- data/spec/thorpe_park_spec.rb +34 -0
- metadata +62 -40
- data/lib/echelon/disneyland_paris.rb +0 -118
- data/lib/echelon/thorpe_park.rb +0 -77
- data/test/test_echelon.rb +0 -11
- data/test/test_helper.rb +0 -3
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
echelon (0.0.2)
|
5
|
+
json_pure (= 1.4.6)
|
6
|
+
zip (= 2.0.2)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.1.2)
|
12
|
+
json_pure (1.4.6)
|
13
|
+
rspec (2.4.0)
|
14
|
+
rspec-core (~> 2.4.0)
|
15
|
+
rspec-expectations (~> 2.4.0)
|
16
|
+
rspec-mocks (~> 2.4.0)
|
17
|
+
rspec-core (2.4.0)
|
18
|
+
rspec-expectations (2.4.0)
|
19
|
+
diff-lcs (~> 1.1.2)
|
20
|
+
rspec-mocks (2.4.0)
|
21
|
+
zip (2.0.2)
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
bundler (>= 1.0.0)
|
28
|
+
echelon!
|
29
|
+
json_pure (= 1.4.6)
|
30
|
+
rspec (>= 2.4.0)
|
31
|
+
zip (= 2.0.2)
|
data/Rakefile
CHANGED
@@ -1,24 +1,2 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'hoe'
|
4
|
-
require 'fileutils'
|
5
|
-
require './lib/echelon'
|
6
|
-
|
7
|
-
Hoe.plugin :newgem
|
8
|
-
# Hoe.plugin :website
|
9
|
-
# Hoe.plugin :cucumberfeatures
|
10
|
-
|
11
|
-
# Generate all the Rake tasks
|
12
|
-
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
13
|
-
$hoe = Hoe.spec 'echelon' do
|
14
|
-
self.developer 'Lloyd Pick', 'lloydpick@gmail.com'
|
15
|
-
self.rubyforge_name = self.name
|
16
|
-
self.extra_deps = [['json_pure','>= 1.4.6']]
|
17
|
-
end
|
18
|
-
|
19
|
-
require 'newgem/tasks'
|
20
|
-
Dir['tasks/**/*.rake'].each { |t| load t }
|
21
|
-
|
22
|
-
# TODO - want other tests/tasks run by default? Add them to the list
|
23
|
-
# remove_task :default
|
24
|
-
# task :default => [:spec, :features]
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
data/echelon.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path("../lib/echelon/version", __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "echelon"
|
7
|
+
s.version = Echelon::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Lloyd Pick"]
|
10
|
+
s.email = ["lloydpick@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/lloydpick/echelon"
|
12
|
+
s.summary = "RubyGem to give quick access to Theme Park queue times"
|
13
|
+
s.description = "RubyGem to give quick access to Theme Park queue times (Disneyland Paris and Thorpe Park supported)"
|
14
|
+
|
15
|
+
s.required_rubygems_version = ">= 1.3.6"
|
16
|
+
s.rubyforge_project = "echelon"
|
17
|
+
|
18
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
19
|
+
s.add_development_dependency "rspec", ">= 2.4.0"
|
20
|
+
|
21
|
+
s.add_dependency "json_pure", "1.4.6"
|
22
|
+
s.add_dependency "zip", "2.0.2"
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
26
|
+
s.require_path = 'lib'
|
27
|
+
end
|
data/lib/echelon/park.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Echelon
|
2
|
+
class Park
|
3
|
+
|
4
|
+
def ride_list
|
5
|
+
{}
|
6
|
+
end
|
7
|
+
|
8
|
+
def rides
|
9
|
+
ride_list.inject([]) do |r, e| r << create_ride_object(e[0]) end
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_by_name(ride)
|
13
|
+
raise ArgumentError, "Unknown ride name" unless ride_list.has_value?(ride)
|
14
|
+
ref = ride_list.index(ride)
|
15
|
+
create_ride_object(ref)
|
16
|
+
end
|
17
|
+
|
18
|
+
def find_by_id(ref)
|
19
|
+
raise ArgumentError, "Unknown ride name" unless ride_list.has_key?(ref)
|
20
|
+
create_ride_object(ref)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
require 'net/http'
|
4
|
+
require 'net/https'
|
5
|
+
require 'zip/zip'
|
6
|
+
|
7
|
+
module Echelon
|
8
|
+
class DisneylandParis < Park
|
9
|
+
|
10
|
+
attr_reader :json_data
|
11
|
+
|
12
|
+
def ride_list
|
13
|
+
{
|
14
|
+
'P1AA01' => 'La Cabane des Robinson',
|
15
|
+
'P1AA02' => 'Indiana Jones and the Temple of Peril',
|
16
|
+
'P1AA04' => 'Pirates of the Caribbean',
|
17
|
+
'P1DA03' => 'Autopia',
|
18
|
+
'P1DA04' => 'Buzz Lightyear Laser Blast',
|
19
|
+
'P1DA06' => 'Les Mystères du Nautilus',
|
20
|
+
'P1DA07' => 'Orbitron',
|
21
|
+
'P1DA08' => 'Space Mountain: Mission 2',
|
22
|
+
'P1DA09' => 'Star Tours',
|
23
|
+
'P1DA12' => 'Captain EO',
|
24
|
+
'P1NA00' => 'Alice\'s Curious Labyrinth',
|
25
|
+
'P1NA01' => 'Blanche-Neige et les Sept Nains',
|
26
|
+
'P1NA02' => 'Le Carrousel de Lancelot',
|
27
|
+
'P1NA03' => 'Casey Jr. - le Petit Train du Cirque',
|
28
|
+
'P1NA05' => 'Dumbo the Flying Elephant',
|
29
|
+
'P1NA07' => '"it\'s a small world" Celebration',
|
30
|
+
'P1NA08' => 'Mad Hatter\'s Tea Cups',
|
31
|
+
'P1NA09' => 'Le Pays des Contes de Fées',
|
32
|
+
'P1NA10' => 'Peter Pan\'s Flight',
|
33
|
+
'P1NA13' => 'Les Voyages de Pinocchio',
|
34
|
+
'P1RA00' => 'Big Thunder Mountain',
|
35
|
+
'P1RA03' => 'Phantom Manor',
|
36
|
+
'P1RA04' => 'River Rogue Keelboats',
|
37
|
+
'P2XA00' => 'Studio Tram Tour: Behind the Magic',
|
38
|
+
'P2XA01' => 'CinéMagique',
|
39
|
+
'P2XA02' => 'Cars Quatre Roues Rallye',
|
40
|
+
'P2XA03' => 'Crush\'s Coaster',
|
41
|
+
'P2XA05' => 'Flying Carpets Over Agrabah',
|
42
|
+
'P2XA06' => 'RC Racer',
|
43
|
+
'P2XA07' => 'Toy Soldiers Parachute Drop',
|
44
|
+
'P2XA08' => 'Slinky Dog Zigzag Spin',
|
45
|
+
'P2ZA00' => 'Armageddon : les Effets Spéciaux',
|
46
|
+
'P2ZA01' => 'Rock\'n\'Roller Coaster starring Aerosmith',
|
47
|
+
'P2ZA02' => 'The Twilight Zone Tower of Terror'
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize
|
52
|
+
# fetch the zipped json feed from the same url as the disney iphone app
|
53
|
+
# (you have no idea how long this took to work out)
|
54
|
+
|
55
|
+
http = Net::HTTP.new('disney.cms.pureagency.com', 443)
|
56
|
+
http.use_ssl = true
|
57
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
58
|
+
|
59
|
+
data = 'key=Ajjjsh;Uj'
|
60
|
+
headers = {
|
61
|
+
'User-Agent' => 'Disneyland 1.0 (iPhone; iPhone OS 4.1; en_GB)',
|
62
|
+
'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8'
|
63
|
+
}
|
64
|
+
resp, data = http.post('/cms/ProxyTempsAttente', data, headers)
|
65
|
+
|
66
|
+
tmp = Tempfile.new('disneyland_paris_zip')
|
67
|
+
tmp << resp.body
|
68
|
+
tmp.close
|
69
|
+
|
70
|
+
json_data = nil
|
71
|
+
Zip::ZipFile.open(tmp.path) { |zipfile|
|
72
|
+
json_data = JSON.parse(zipfile.read("temps_attente.json"))
|
73
|
+
json_data = json_data["l"]
|
74
|
+
}
|
75
|
+
|
76
|
+
i = 0
|
77
|
+
rides = []
|
78
|
+
while i < json_data.count
|
79
|
+
ride = []
|
80
|
+
ride << json_data[i]
|
81
|
+
ride << json_data[i + 1]
|
82
|
+
ride << json_data[i + 2]
|
83
|
+
ride << json_data[i + 3]
|
84
|
+
ride << json_data[i + 4]
|
85
|
+
rides << ride
|
86
|
+
i += 5
|
87
|
+
end
|
88
|
+
|
89
|
+
@json_data = rides
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def create_ride_object(ref)
|
95
|
+
self.json_data.each do |ride|
|
96
|
+
if ride[0] == ref
|
97
|
+
return Ride.new(:name => self.ride_list[ref], :queue_time => ride[4].to_i, :active => ride[3].to_i)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
module Echelon
|
6
|
+
class ThorpePark < Park
|
7
|
+
|
8
|
+
attr_reader :json_data
|
9
|
+
|
10
|
+
def ride_list
|
11
|
+
{
|
12
|
+
1 => 'SAW - The Ride',
|
13
|
+
3 => 'Stealth',
|
14
|
+
4 => 'Colossus',
|
15
|
+
5 => 'Detonator',
|
16
|
+
6 => 'Nemesis Inferno',
|
17
|
+
7 => 'Rush',
|
18
|
+
8 => 'Samurai',
|
19
|
+
9 => 'Slammer',
|
20
|
+
10 => 'Tidal Wave',
|
21
|
+
11 => 'Vortex',
|
22
|
+
12 => 'X:\No Way Out',
|
23
|
+
13 => 'Time Voyagers',
|
24
|
+
14 => 'Quantum',
|
25
|
+
15 => 'Loggers Leap',
|
26
|
+
16 => 'Flying Fish',
|
27
|
+
17 => 'Rumba Rapids',
|
28
|
+
18 => 'Zodiac',
|
29
|
+
19 => 'Depth Charge',
|
30
|
+
20 => 'SAW Alive',
|
31
|
+
21 => 'Mr. Monkey\'s Banana Ride',
|
32
|
+
22 => 'Storm in a Teacup',
|
33
|
+
23 => 'Rocky Express',
|
34
|
+
24 => 'Wet Wet Wet',
|
35
|
+
25 => 'Neptune\'s Beach',
|
36
|
+
26 => 'Chief Ranger\'s Carousel'
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize
|
41
|
+
# fetch the json feed from the merlin site
|
42
|
+
url = "http://www.merlincms.com/1.php"
|
43
|
+
resp = Net::HTTP.get_response(URI.parse(url))
|
44
|
+
data = resp.body
|
45
|
+
|
46
|
+
# were only interested in the ride data, throw everything else away
|
47
|
+
json_data = JSON.parse(data)
|
48
|
+
@json_data = json_data["Rides"]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def create_ride_object(ref)
|
54
|
+
self.json_data.each do |ride|
|
55
|
+
if ride["ref"].to_i == ref
|
56
|
+
return Ride.new(:name => self.ride_list[ref], :queue_time => ride["queue"].to_i, :active => ride["active"].to_i)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/lib/echelon.rb
CHANGED
@@ -2,9 +2,10 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
require "#{File.dirname(__FILE__)}/echelon/ride.rb"
|
5
|
-
require "#{File.dirname(__FILE__)}/echelon/
|
6
|
-
|
5
|
+
require "#{File.dirname(__FILE__)}/echelon/park.rb"
|
6
|
+
|
7
|
+
require "#{File.dirname(__FILE__)}/echelon/parks/thorpe_park.rb"
|
8
|
+
require "#{File.dirname(__FILE__)}/echelon/parks/disneyland_paris.rb"
|
7
9
|
|
8
10
|
module Echelon
|
9
|
-
VERSION = '0.0.2'
|
10
11
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'echelon/park'
|
2
|
+
require 'echelon/parks/disneyland_paris'
|
3
|
+
|
4
|
+
# Mosts of the test here are pretty generic, although you can test for specific
|
5
|
+
# cases, such as the active states may differ between parks, and queue times may
|
6
|
+
# not exceed a certain value etc etc.
|
7
|
+
|
8
|
+
describe Echelon::DisneylandParis do
|
9
|
+
|
10
|
+
before do
|
11
|
+
@park = Echelon::DisneylandParis.new()
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should inherit from Park" do
|
15
|
+
@park.should be_kind_of(Echelon::DisneylandParis)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have some rides" do
|
19
|
+
@park.ride_list.count.should satisfy { |v| v > 1 && v < 40 }
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return ride objects" do
|
23
|
+
@park.find_by_name("Pirates of the Caribbean").should be_kind_of(Echelon::Ride)
|
24
|
+
@park.find_by_id('P1AA04').should be_kind_of(Echelon::Ride)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return ride object values correctly" do
|
28
|
+
stealth = @park.find_by_id("P1AA04")
|
29
|
+
stealth.name.should eql("Pirates of the Caribbean")
|
30
|
+
stealth.queue_time.should satisfy { |v| v >= 0 && v < 500 }
|
31
|
+
stealth.active.should satisfy { |v| v >= -1 && v < 3 }
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'echelon/ride'
|
2
|
+
require 'echelon/park'
|
3
|
+
|
4
|
+
describe Echelon::Ride do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@ride = Echelon::Ride.new(:name => 'Ride', :queue_time => 10, :active => 1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return the name of the ride" do
|
11
|
+
@ride.name.should eql('Ride')
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return the queue time" do
|
15
|
+
@ride.queue_time.should eql(10)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return the ride status" do
|
19
|
+
@ride.active.should eql(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe Echelon::Park do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@park = Echelon::Park.new
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should provide a set of methods" do
|
31
|
+
@park.should respond_to(:ride_list)
|
32
|
+
@park.should respond_to(:rides)
|
33
|
+
@park.should respond_to(:find_by_name)
|
34
|
+
@park.should respond_to(:find_by_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should contain a blank ride list" do
|
38
|
+
@park.ride_list.should eql({})
|
39
|
+
@park.rides.should eql([])
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'find_by_name' do
|
43
|
+
it "should raise if ride isn't available" do
|
44
|
+
lambda { @park.find_by_name('Unknown Ride') }.should raise_error(ArgumentError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'find_by_id' do
|
49
|
+
it "should raise if ride isn't available" do
|
50
|
+
lambda { @park.find_by_id(1) }.should raise_error(ArgumentError)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'echelon/park'
|
2
|
+
require 'echelon/parks/thorpe_park'
|
3
|
+
|
4
|
+
# Mosts of the test here are pretty generic, although you can test for specific
|
5
|
+
# cases, such as the active states may differ between parks, and queue times may
|
6
|
+
# not exceed a certain value etc etc.
|
7
|
+
|
8
|
+
describe Echelon::ThorpePark do
|
9
|
+
|
10
|
+
before do
|
11
|
+
@park = Echelon::ThorpePark.new()
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should inherit from Park" do
|
15
|
+
@park.should be_kind_of(Echelon::ThorpePark)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have some rides" do
|
19
|
+
@park.ride_list.count.should satisfy { |v| v > 1 && v < 30 }
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return ride objects" do
|
23
|
+
@park.find_by_name("Stealth").should be_kind_of(Echelon::Ride)
|
24
|
+
@park.find_by_id(3).should be_kind_of(Echelon::Ride)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return ride object values correctly" do
|
28
|
+
stealth = @park.find_by_id(3)
|
29
|
+
stealth.name.should eql("Stealth")
|
30
|
+
stealth.queue_time.should satisfy { |v| v >= 0 && v < 1000 }
|
31
|
+
stealth.active.should satisfy { |v| v == 0 || v == 1 }
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: echelon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Lloyd Pick
|
@@ -15,86 +15,107 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-11 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: bundler
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 23
|
30
30
|
segments:
|
31
31
|
- 1
|
32
|
-
-
|
33
|
-
-
|
34
|
-
version: 1.
|
35
|
-
type: :
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :development
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: rspec
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 31
|
46
46
|
segments:
|
47
47
|
- 2
|
48
|
-
- 0
|
49
48
|
- 4
|
50
|
-
|
49
|
+
- 0
|
50
|
+
version: 2.4.0
|
51
51
|
type: :development
|
52
52
|
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
54
|
+
name: json_pure
|
55
55
|
prerelease: false
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 11
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 4
|
65
|
+
- 6
|
66
|
+
version: 1.4.6
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: zip
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - "="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 11
|
62
78
|
segments:
|
63
79
|
- 2
|
64
|
-
- 7
|
65
80
|
- 0
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
81
|
+
- 2
|
82
|
+
version: 2.0.2
|
83
|
+
type: :runtime
|
84
|
+
version_requirements: *id004
|
85
|
+
description: RubyGem to give quick access to Theme Park queue times (Disneyland Paris and Thorpe Park supported)
|
70
86
|
email:
|
71
87
|
- lloydpick@gmail.com
|
72
88
|
executables: []
|
73
89
|
|
74
90
|
extensions: []
|
75
91
|
|
76
|
-
extra_rdoc_files:
|
77
|
-
|
78
|
-
- Manifest.txt
|
92
|
+
extra_rdoc_files: []
|
93
|
+
|
79
94
|
files:
|
95
|
+
- .gitignore
|
96
|
+
- Gemfile
|
97
|
+
- Gemfile.lock
|
80
98
|
- History.txt
|
81
99
|
- Manifest.txt
|
82
100
|
- README.rdoc
|
83
101
|
- Rakefile
|
102
|
+
- echelon.gemspec
|
84
103
|
- lib/echelon.rb
|
104
|
+
- lib/echelon/park.rb
|
105
|
+
- lib/echelon/parks/disneyland_paris.rb
|
106
|
+
- lib/echelon/parks/thorpe_park.rb
|
85
107
|
- lib/echelon/ride.rb
|
86
|
-
- lib/echelon/
|
87
|
-
-
|
88
|
-
-
|
89
|
-
-
|
108
|
+
- lib/echelon/version.rb
|
109
|
+
- spec/disneyland_paris_spec.rb
|
110
|
+
- spec/echelon_spec.rb
|
111
|
+
- spec/thorpe_park_spec.rb
|
90
112
|
has_rdoc: true
|
91
113
|
homepage: http://github.com/lloydpick/echelon
|
92
114
|
licenses: []
|
93
115
|
|
94
116
|
post_install_message:
|
95
|
-
rdoc_options:
|
96
|
-
|
97
|
-
- README.rdoc
|
117
|
+
rdoc_options: []
|
118
|
+
|
98
119
|
require_paths:
|
99
120
|
- lib
|
100
121
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -111,17 +132,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
132
|
requirements:
|
112
133
|
- - ">="
|
113
134
|
- !ruby/object:Gem::Version
|
114
|
-
hash:
|
135
|
+
hash: 23
|
115
136
|
segments:
|
116
|
-
-
|
117
|
-
|
137
|
+
- 1
|
138
|
+
- 3
|
139
|
+
- 6
|
140
|
+
version: 1.3.6
|
118
141
|
requirements: []
|
119
142
|
|
120
143
|
rubyforge_project: echelon
|
121
|
-
rubygems_version: 1.
|
144
|
+
rubygems_version: 1.4.1
|
122
145
|
signing_key:
|
123
146
|
specification_version: 3
|
124
147
|
summary: RubyGem to give quick access to Theme Park queue times
|
125
|
-
test_files:
|
126
|
-
|
127
|
-
- test/test_echelon.rb
|
148
|
+
test_files: []
|
149
|
+
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'json'
|
3
|
-
require 'net/http'
|
4
|
-
require 'net/https'
|
5
|
-
require 'zip/zip'
|
6
|
-
|
7
|
-
module Echelon
|
8
|
-
class DisneylandParis
|
9
|
-
|
10
|
-
attr_reader :json_data
|
11
|
-
|
12
|
-
RIDES = {
|
13
|
-
'P1AA01' => 'La Cabane des Robinson',
|
14
|
-
'P1AA02' => 'Indiana Jones and the Temple of Peril',
|
15
|
-
'P1AA04' => 'Pirates of the Caribbean',
|
16
|
-
'P1DA03' => 'Autopia',
|
17
|
-
'P1DA04' => 'Buzz Lightyear Laser Blast',
|
18
|
-
'P1DA06' => 'Les Mystères du Nautilus',
|
19
|
-
'P1DA07' => 'Orbitron',
|
20
|
-
'P1DA08' => 'Space Mountain: Mission 2',
|
21
|
-
'P1DA09' => 'Star Tours',
|
22
|
-
'P1DA12' => 'Captain EO',
|
23
|
-
'P1NA00' => 'Alice\'s Curious Labyrinth',
|
24
|
-
'P1NA01' => 'Blanche-Neige et les Sept Nains',
|
25
|
-
'P1NA02' => 'Le Carrousel de Lancelot',
|
26
|
-
'P1NA03' => 'Casey Jr. - le Petit Train du Cirque',
|
27
|
-
'P1NA05' => 'Dumbo the Flying Elephant',
|
28
|
-
'P1NA07' => '"it\'s a small world" Celebration',
|
29
|
-
'P1NA08' => 'Mad Hatter\'s Tea Cups',
|
30
|
-
'P1NA09' => 'Le Pays des Contes de Fées',
|
31
|
-
'P1NA10' => 'Peter Pan\'s Flight',
|
32
|
-
'P1NA13' => 'Les Voyages de Pinocchio',
|
33
|
-
'P1RA00' => 'Big Thunder Mountain',
|
34
|
-
'P1RA03' => 'Phantom Manor',
|
35
|
-
'P1RA04' => 'River Rogue Keelboats',
|
36
|
-
'P2XA00' => 'Studio Tram Tour: Behind the Magic',
|
37
|
-
'P2XA01' => 'CinéMagique',
|
38
|
-
'P2XA02' => 'Cars Quatre Roues Rallye',
|
39
|
-
'P2XA03' => 'Crush\'s Coaster',
|
40
|
-
'P2XA05' => 'Flying Carpets Over Agrabah',
|
41
|
-
'P2XA06' => 'RC Racer',
|
42
|
-
'P2XA07' => 'Toy Soldiers Parachute Drop',
|
43
|
-
'P2XA08' => 'Slinky Dog Zigzag Spin',
|
44
|
-
'P2ZA00' => 'Armageddon : les Effets Spéciaux',
|
45
|
-
'P2ZA01' => 'Rock\'n\'Roller Coaster starring Aerosmith',
|
46
|
-
'P2ZA02' => 'The Twilight Zone Tower of Terror'
|
47
|
-
}
|
48
|
-
|
49
|
-
def initialize
|
50
|
-
# fetch the zipped json feed from the same url as the disney iphone app
|
51
|
-
# (you have no idea how long this took to work out)
|
52
|
-
|
53
|
-
http = Net::HTTP.new('disney.cms.pureagency.com', 443)
|
54
|
-
http.use_ssl = true
|
55
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
56
|
-
|
57
|
-
data = 'key=Ajjjsh;Uj'
|
58
|
-
headers = {
|
59
|
-
'User-Agent' => 'Disneyland 1.0 (iPhone; iPhone OS 4.1; en_GB)',
|
60
|
-
'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8'
|
61
|
-
}
|
62
|
-
resp, data = http.post('/cms/ProxyTempsAttente', data, headers)
|
63
|
-
|
64
|
-
tmp = Tempfile.new('disneyland_paris_zip')
|
65
|
-
tmp << resp.body
|
66
|
-
tmp.close
|
67
|
-
|
68
|
-
json_data = nil
|
69
|
-
Zip::ZipFile.open(tmp.path) { |zipfile|
|
70
|
-
json_data = JSON.parse(zipfile.read("temps_attente.json"))
|
71
|
-
json_data = json_data["l"]
|
72
|
-
}
|
73
|
-
|
74
|
-
i = 0
|
75
|
-
rides = []
|
76
|
-
while i < json_data.count
|
77
|
-
ride = []
|
78
|
-
ride << json_data[i]
|
79
|
-
ride << json_data[i + 1]
|
80
|
-
ride << json_data[i + 2]
|
81
|
-
ride << json_data[i + 3]
|
82
|
-
ride << json_data[i + 4]
|
83
|
-
rides << ride
|
84
|
-
i += 5
|
85
|
-
end
|
86
|
-
|
87
|
-
@json_data = rides
|
88
|
-
end
|
89
|
-
|
90
|
-
def rides
|
91
|
-
all_rides = []
|
92
|
-
RIDES.each do |ride| all_rides << create_ride_object(ride[0]) end
|
93
|
-
all_rides
|
94
|
-
end
|
95
|
-
|
96
|
-
def find_by_name(ride)
|
97
|
-
raise ArgumentError, "Unknown ride name" unless RIDES.has_value?(ride)
|
98
|
-
ref = RIDES.index(ride)
|
99
|
-
create_ride_object(ref)
|
100
|
-
end
|
101
|
-
|
102
|
-
def find_by_id(ref)
|
103
|
-
raise ArgumentError, "Unknown ride name" unless RIDES.has_key?(ref)
|
104
|
-
create_ride_object(ref)
|
105
|
-
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
def create_ride_object(ref)
|
110
|
-
self.json_data.each do |ride|
|
111
|
-
if ride[0] == ref
|
112
|
-
return Ride.new(:name => RIDES[ref], :queue_time => ride[4].to_i, :active => ride[3].to_i)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
end
|
data/lib/echelon/thorpe_park.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'json'
|
3
|
-
require 'net/http'
|
4
|
-
|
5
|
-
module Echelon
|
6
|
-
class ThorpePark
|
7
|
-
|
8
|
-
attr_reader :json_data
|
9
|
-
|
10
|
-
RIDES = {
|
11
|
-
1 => 'SAW - The Ride',
|
12
|
-
3 => 'Stealth',
|
13
|
-
4 => 'Colossus',
|
14
|
-
5 => 'Detonator',
|
15
|
-
6 => 'Nemesis Inferno',
|
16
|
-
7 => 'Rush',
|
17
|
-
8 => 'Samurai',
|
18
|
-
9 => 'Slammer',
|
19
|
-
10 => 'Tidal Wave',
|
20
|
-
11 => 'Vortex',
|
21
|
-
12 => 'X:\No Way Out',
|
22
|
-
13 => 'Time Voyagers',
|
23
|
-
14 => 'Quantum',
|
24
|
-
15 => 'Loggers Leap',
|
25
|
-
16 => 'Flying Fish',
|
26
|
-
17 => 'Rumba Rapids',
|
27
|
-
18 => 'Zodiac',
|
28
|
-
19 => 'Depth Charge',
|
29
|
-
20 => 'SAW Alive',
|
30
|
-
21 => 'Mr. Monkey\'s Banana Ride',
|
31
|
-
22 => 'Storm in a Teacup',
|
32
|
-
23 => 'Rocky Express',
|
33
|
-
24 => 'Wet Wet Wet',
|
34
|
-
25 => 'Neptune\'s Beach',
|
35
|
-
26 => 'Chief Ranger\'s Carousel'
|
36
|
-
}
|
37
|
-
|
38
|
-
def initialize
|
39
|
-
# fetch the json feed from the merlin site
|
40
|
-
url = "http://www.merlincms.com/1.php"
|
41
|
-
resp = Net::HTTP.get_response(URI.parse(url))
|
42
|
-
data = resp.body
|
43
|
-
|
44
|
-
# were only interested in the ride data, throw everything else away
|
45
|
-
json_data = JSON.parse(data)
|
46
|
-
@json_data = json_data["Rides"]
|
47
|
-
end
|
48
|
-
|
49
|
-
def rides
|
50
|
-
all_rides = []
|
51
|
-
RIDES.each do |ride| all_rides << create_ride_object(ride[0]) end
|
52
|
-
all_rides
|
53
|
-
end
|
54
|
-
|
55
|
-
def find_by_name(ride)
|
56
|
-
raise ArgumentError, "Unknown ride name" unless RIDES.has_value?(ride)
|
57
|
-
ref = RIDES.index(ride)
|
58
|
-
create_ride_object(ref)
|
59
|
-
end
|
60
|
-
|
61
|
-
def find_by_id(ref)
|
62
|
-
raise ArgumentError, "Unknown ride name" unless RIDES.has_key?(ref)
|
63
|
-
create_ride_object(ref)
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def create_ride_object(ref)
|
69
|
-
self.json_data.each do |ride|
|
70
|
-
if ride["ref"].to_i == ref
|
71
|
-
return Ride.new(:name => RIDES[ref], :queue_time => ride["queue"].to_i, :active => ride["active"].to_i)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
data/test/test_echelon.rb
DELETED
data/test/test_helper.rb
DELETED