citibike_trips 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +2 -2
- data/lib/citibike_trips.rb +6 -4
- data/lib/citibike_trips/station.rb +5 -0
- data/lib/citibike_trips/stations.rb +9 -0
- data/lib/citibike_trips/trip.rb +8 -2
- data/lib/citibike_trips/trips.rb +15 -2
- data/lib/citibike_trips/version.rb +1 -1
- data/test/test_station.rb +20 -8
- data/test/test_stations.rb +17 -0
- data/test/test_trip.rb +18 -10
- data/test/test_trips.rb +31 -7
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fba8e04a64f48c175b81ccd0a4f0710d701f9a4
|
4
|
+
data.tar.gz: 52337dcffc7f85acc1c5273ae1ea003c8973ee9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 612f2a71a88604036f83728a0f6e3f1a790b23a91e1c45960ad81bc71354455a599464f6c50f88182de57a39d28985dcb561d38ac0822cffeb9546545029aba7
|
7
|
+
data.tar.gz: cdd34b158aa712dbe06012ee1adfe9709df4550f6b755e6b44c9ebbf53cd119035c05a62328620893d1a9cc1cabfedc585f9f8b10d600cbefdc497aac09d3eb0
|
data/README.md
CHANGED
@@ -21,13 +21,13 @@ Or install it yourself as:
|
|
21
21
|
Each trip has a unique id, start station, end station, start timestamp and end timestamp. The stations will be an instance of CitibikeTrips::Station.
|
22
22
|
|
23
23
|
trips = CitibikeTrips::Trips.new
|
24
|
-
puts trips.trips.length
|
25
24
|
puts trips.first.start_station.name
|
26
25
|
puts trips.first.end_timestamp
|
26
|
+
trips.each{|trip| puts trip.id}
|
27
27
|
|
28
28
|
stations = CitibikeTrips::Stations.new
|
29
|
-
puts stations.stations.length
|
30
29
|
puts stations[72].name
|
30
|
+
stations.each{|id, station| puts station.name}
|
31
31
|
|
32
32
|
## Contributing
|
33
33
|
|
data/lib/citibike_trips.rb
CHANGED
@@ -3,15 +3,17 @@ require 'citibike_trips/station'
|
|
3
3
|
require 'citibike_trips/stations'
|
4
4
|
require 'citibike_trips/trip'
|
5
5
|
require 'citibike_trips/trips'
|
6
|
-
require 'highline
|
6
|
+
require 'highline'
|
7
7
|
require 'mechanize'
|
8
8
|
|
9
9
|
module CitibikeTrips
|
10
10
|
LOGIN_URL = 'https://www.citibikenyc.com/login'
|
11
|
-
def self.login(page)
|
11
|
+
def self.login(page, options={})
|
12
|
+
stdout = options[:stdout] || $stdout
|
13
|
+
h = HighLine.new($stdin, stdout)
|
12
14
|
page.form_with(action: LOGIN_URL) do |form|
|
13
|
-
form.subscriberUsername = ask('Citi Bike username: ')
|
14
|
-
form.subscriberPassword = ask('Citi Bike password: ') {|q| q.echo = false}
|
15
|
+
form.subscriberUsername = h.ask('Citi Bike username: ')
|
16
|
+
form.subscriberPassword = h.ask('Citi Bike password: ') {|q| q.echo = false}
|
15
17
|
form.click_button(form.button_with(name: 'login_submit'))
|
16
18
|
end
|
17
19
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class CitibikeTrips::Station
|
2
4
|
attr_reader :id, :name,
|
3
5
|
:available_docks, :total_docks, :available_bikes,
|
@@ -34,4 +36,7 @@ class CitibikeTrips::Station
|
|
34
36
|
@last_communication_time = data['lastCommunicationTime']
|
35
37
|
@landmark = data['landMark']
|
36
38
|
end
|
39
|
+
def to_json(*a)
|
40
|
+
Hash[instance_variables.collect{|i| [i[1..-1], instance_variable_get(i)]}].to_json(*a)
|
41
|
+
end
|
37
42
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class CitibikeTrips::Stations
|
4
|
+
include Enumerable
|
2
5
|
STATIONS_URL = 'https://www.citibikenyc.com/stations/json'
|
3
6
|
|
4
7
|
attr_reader :timestamp, :stations
|
@@ -18,4 +21,10 @@ class CitibikeTrips::Stations
|
|
18
21
|
def [](id)
|
19
22
|
@stations[id]
|
20
23
|
end
|
24
|
+
def each(&block)
|
25
|
+
@stations.each(&block)
|
26
|
+
end
|
27
|
+
def to_json(*a)
|
28
|
+
@stations.to_json(*a)
|
29
|
+
end
|
21
30
|
end
|
data/lib/citibike_trips/trip.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class CitibikeTrips::Trip
|
2
4
|
attr_reader :id, :start_station, :end_station, :start_timestamp, :end_timestamp
|
3
5
|
|
4
|
-
def initialize(id, start_station, end_station, start_timestamp,
|
6
|
+
def initialize(id, start_station, end_station, start_timestamp, end_timestamp)
|
5
7
|
@id = id
|
6
8
|
stations = CitibikeTrips::Stations.new
|
7
9
|
@start_station = stations[start_station.to_i]
|
8
10
|
@end_station = stations[end_station.to_i]
|
9
11
|
@start_timestamp = Time.at(start_timestamp.to_i)
|
10
|
-
@end_timestamp = Time.at(
|
12
|
+
@end_timestamp = Time.at(end_timestamp.to_i)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*a)
|
16
|
+
Hash[instance_variables.collect{|i| [i[1..-1], instance_variable_get(i)]}].to_json(*a)
|
11
17
|
end
|
12
18
|
end
|
data/lib/citibike_trips/trips.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class CitibikeTrips::Trips
|
4
|
+
include Enumerable
|
2
5
|
TRIPS_URL = 'https://www.citibikenyc.com/member/trips'
|
3
6
|
|
4
7
|
attr_reader :trips
|
5
8
|
|
6
|
-
def initialize
|
9
|
+
def initialize(options={})
|
7
10
|
agent = Mechanize.new
|
8
11
|
@trips = []
|
9
12
|
url = TRIPS_URL
|
@@ -24,10 +27,20 @@ class CitibikeTrips::Trips
|
|
24
27
|
break
|
25
28
|
end
|
26
29
|
elsif page.uri.to_s == CitibikeTrips::LOGIN_URL
|
27
|
-
CitibikeTrips.login(page)
|
30
|
+
CitibikeTrips.login(page, {stdout: options[:stdout]})
|
28
31
|
else
|
29
32
|
raise "Got redirected to unexpected page #{page.uri.to_s}"
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
36
|
+
|
37
|
+
def [](index)
|
38
|
+
@trips[index]
|
39
|
+
end
|
40
|
+
def each(&block)
|
41
|
+
@trips.each(&block)
|
42
|
+
end
|
43
|
+
def to_json(*a)
|
44
|
+
@trips.to_json(*a)
|
45
|
+
end
|
33
46
|
end
|
data/test/test_station.rb
CHANGED
@@ -22,20 +22,32 @@ class StationTests < Test::Unit::TestCase
|
|
22
22
|
"testStation"=>false,
|
23
23
|
"lastCommunicationTime"=>nil,
|
24
24
|
"landMark"=>""}
|
25
|
+
@station = CitibikeTrips::Station.new(@data)
|
25
26
|
end
|
26
27
|
|
27
28
|
def test_initialize
|
28
|
-
station = CitibikeTrips::Station.new(@data)
|
29
29
|
# Some regular fields
|
30
|
-
assert_equal 72, station.id
|
31
|
-
assert_equal 'W 52 St & 11 Ave', station.name
|
32
|
-
assert_equal false, station.test_station
|
30
|
+
assert_equal 72, @station.id
|
31
|
+
assert_equal 'W 52 St & 11 Ave', @station.name
|
32
|
+
assert_equal false, @station.test_station
|
33
33
|
# Test conversion of empty string values to nil
|
34
|
-
assert_nil station.location
|
34
|
+
assert_nil @station.location
|
35
35
|
# Test special handling of city
|
36
|
-
assert_equal 'New York', station.city
|
36
|
+
assert_equal 'New York', @station.city
|
37
37
|
# Virtual fields
|
38
|
-
assert_equal ['W 52 St & 11 Ave'], station.street_address_array
|
39
|
-
assert_equal 'W 52 St & 11 Ave', station.street_address
|
38
|
+
assert_equal ['W 52 St & 11 Ave'], @station.street_address_array
|
39
|
+
assert_equal 'W 52 St & 11 Ave', @station.street_address
|
40
|
+
end
|
41
|
+
def test_to_json
|
42
|
+
json = @station.to_json
|
43
|
+
assert_kind_of String, json
|
44
|
+
data = JSON.parse(json)
|
45
|
+
assert_equal 72, data['id']
|
46
|
+
assert_equal 'W 52 St & 11 Ave', data['name']
|
47
|
+
assert_equal false, data['test_station']
|
48
|
+
assert_nil data['location']
|
49
|
+
assert_equal 'New York', data['city']
|
50
|
+
assert_equal ['W 52 St & 11 Ave'], data['street_address_array']
|
51
|
+
assert_equal 'W 52 St & 11 Ave', data['street_address']
|
40
52
|
end
|
41
53
|
end
|
data/test/test_stations.rb
CHANGED
@@ -22,4 +22,21 @@ class StationsTests < Test::Unit::TestCase
|
|
22
22
|
assert_equal 'W 52 St & 11 Ave', @stations[72].name
|
23
23
|
assert_equal 20, @stations[3002].available_docks
|
24
24
|
end
|
25
|
+
def test_each
|
26
|
+
count = 0
|
27
|
+
@stations.each{|id, station| count += 1}
|
28
|
+
assert_equal 332, count
|
29
|
+
end
|
30
|
+
def test_includes_enumerable
|
31
|
+
assert @stations.any?{|id, station| id == 72 && station.name == 'W 52 St & 11 Ave'}
|
32
|
+
assert @stations.all?{|id, station| station.name}
|
33
|
+
end
|
34
|
+
def test_to_json
|
35
|
+
json = @stations.to_json
|
36
|
+
assert_kind_of String, json
|
37
|
+
data = JSON.parse(json)
|
38
|
+
assert_equal 332, data.length
|
39
|
+
assert_equal 'W 52 St & 11 Ave', data['72']['name']
|
40
|
+
assert_equal 20, data['3002']['available_docks']
|
41
|
+
end
|
25
42
|
end
|
data/test/test_trip.rb
CHANGED
@@ -2,19 +2,27 @@ require 'test/unit'
|
|
2
2
|
require 'citibike_trips'
|
3
3
|
|
4
4
|
class TripTests < Test::Unit::TestCase
|
5
|
-
def
|
5
|
+
def setup
|
6
6
|
page = Mechanize::Page.new
|
7
7
|
Mechanize.any_instance.stubs(:get).with(CitibikeTrips::Stations::STATIONS_URL).returns(page)
|
8
8
|
json = File.read("#{File.dirname(__FILE__)}/samples/stations.json")
|
9
9
|
page.stubs(:body).returns(json)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
assert_equal
|
18
|
-
assert_equal Time.at(
|
10
|
+
@trip = CitibikeTrips::Trip.new('trip-13150976', '151', '517', '1406760278', '1406761369')
|
11
|
+
end
|
12
|
+
def test_initialize
|
13
|
+
assert_equal 'trip-13150976', @trip.id
|
14
|
+
assert_kind_of CitibikeTrips::Station, @trip.start_station
|
15
|
+
assert_equal 'Cleveland Pl & Spring St', @trip.start_station.name
|
16
|
+
assert_kind_of CitibikeTrips::Station, @trip.end_station
|
17
|
+
assert_equal 'E 41 St & Madison Ave', @trip.end_station.name
|
18
|
+
assert_equal Time.at(1406760278), @trip.start_timestamp
|
19
|
+
assert_equal Time.at(1406761369), @trip.end_timestamp
|
20
|
+
end
|
21
|
+
def test_to_json
|
22
|
+
json = @trip.to_json
|
23
|
+
assert_kind_of String, json
|
24
|
+
data = JSON.parse(json)
|
25
|
+
assert_equal 'trip-13150976', data['id']
|
26
|
+
assert_equal 'E 41 St & Madison Ave', data['end_station']['name']
|
19
27
|
end
|
20
28
|
end
|
data/test/test_trips.rb
CHANGED
@@ -3,7 +3,7 @@ require 'mocha/test_unit'
|
|
3
3
|
require 'citibike_trips'
|
4
4
|
|
5
5
|
class TripsTests < Test::Unit::TestCase
|
6
|
-
def
|
6
|
+
def setup
|
7
7
|
agent = Mechanize.new
|
8
8
|
uri1 = 'https://www.citibikenyc.com/member/trips'
|
9
9
|
uri2 = 'https://www.citibikenyc.com/member/trips/2'
|
@@ -25,14 +25,38 @@ class TripsTests < Test::Unit::TestCase
|
|
25
25
|
json = File.read("#{File.dirname(__FILE__)}/samples/stations.json")
|
26
26
|
page.stubs(:body).returns(json)
|
27
27
|
|
28
|
-
trips = CitibikeTrips::Trips.new
|
28
|
+
@trips = CitibikeTrips::Trips.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_initialize
|
29
32
|
# 26+20+4
|
30
|
-
assert_equal 50, trips.trips.length
|
31
|
-
trips.trips.each do |t|
|
33
|
+
assert_equal 50, @trips.trips.length
|
34
|
+
@trips.trips.each do |t|
|
32
35
|
assert_kind_of CitibikeTrips::Trip, t
|
33
36
|
end
|
34
|
-
assert_equal 'trip-13150976', trips.trips.first.id
|
35
|
-
assert_equal Time.at(1369869537), trips.trips.last.start_timestamp
|
36
|
-
assert_equal 'Broadway & W 58 St', trips.trips.last.start_station.name
|
37
|
+
assert_equal 'trip-13150976', @trips.trips.first.id
|
38
|
+
assert_equal Time.at(1369869537), @trips.trips.last.start_timestamp
|
39
|
+
assert_equal 'Broadway & W 58 St', @trips.trips.last.start_station.name
|
40
|
+
end
|
41
|
+
def test_index_access
|
42
|
+
assert_equal 'trip-13150976', @trips[0].id
|
43
|
+
assert_equal 'Broadway & W 58 St', @trips[-1].start_station.name
|
44
|
+
end
|
45
|
+
def test_each
|
46
|
+
count = 0
|
47
|
+
@trips.each{|trip| count += 1}
|
48
|
+
assert_equal 50, count
|
49
|
+
end
|
50
|
+
def test_includes_enumerable
|
51
|
+
assert @trips.any?{|trip| trip.id == 'trip-13150976'}
|
52
|
+
assert @trips.all?{|trip| trip.id}
|
53
|
+
end
|
54
|
+
def test_to_json
|
55
|
+
json = @trips.to_json
|
56
|
+
assert_kind_of String, json
|
57
|
+
data = JSON.parse(json)
|
58
|
+
assert_equal 50, data.length
|
59
|
+
assert_equal 'trip-13150976', data[0]['id']
|
60
|
+
assert_equal 'Broadway & W 58 St', data[-1]['start_station']['name']
|
37
61
|
end
|
38
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: citibike_trips
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Heiss
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -140,4 +140,3 @@ test_files:
|
|
140
140
|
- test/test_stations.rb
|
141
141
|
- test/test_trip.rb
|
142
142
|
- test/test_trips.rb
|
143
|
-
has_rdoc:
|