njtransit 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.
- checksums.yaml +7 -0
- data/.claude/commands/njtransit.md +196 -0
- data/.mcp.json.example +12 -0
- data/.mcp.json.sample +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +87 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +37 -0
- data/CLAUDE.md +159 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/LICENSE.txt +21 -0
- data/README.md +148 -0
- data/Rakefile +12 -0
- data/docs/plans/2025-01-24-njtransit-gem-design.md +112 -0
- data/docs/plans/2026-01-24-bus-api-design.md +119 -0
- data/docs/plans/2026-01-24-gtfs-implementation.md +2216 -0
- data/docs/plans/2026-01-24-gtfs-loader-design.md +351 -0
- data/docs/superpowers/plans/2026-03-26-dev-infra-and-agent.md +480 -0
- data/lefthook.yml +17 -0
- data/lib/njtransit/client.rb +291 -0
- data/lib/njtransit/configuration.rb +49 -0
- data/lib/njtransit/error.rb +50 -0
- data/lib/njtransit/gtfs/database.rb +145 -0
- data/lib/njtransit/gtfs/importer.rb +124 -0
- data/lib/njtransit/gtfs/models/route.rb +59 -0
- data/lib/njtransit/gtfs/models/stop.rb +63 -0
- data/lib/njtransit/gtfs/queries/routes_between.rb +62 -0
- data/lib/njtransit/gtfs/queries/schedule.rb +75 -0
- data/lib/njtransit/gtfs.rb +119 -0
- data/lib/njtransit/railtie.rb +9 -0
- data/lib/njtransit/resources/base.rb +35 -0
- data/lib/njtransit/resources/bus/enrichment.rb +105 -0
- data/lib/njtransit/resources/bus.rb +95 -0
- data/lib/njtransit/resources/bus_gtfs.rb +34 -0
- data/lib/njtransit/resources/rail.rb +47 -0
- data/lib/njtransit/resources/rail_gtfs.rb +27 -0
- data/lib/njtransit/tasks.rb +74 -0
- data/lib/njtransit/version.rb +5 -0
- data/lib/njtransit.rb +40 -0
- data/sig/njtransit.rbs +4 -0
- metadata +177 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NJTransit
|
|
4
|
+
module Resources
|
|
5
|
+
class RailGTFS < Base
|
|
6
|
+
# Returns Rail GTFS static schedule data as ZIP binary
|
|
7
|
+
def schedule_data
|
|
8
|
+
client.post_form_raw("/api/GTFSRT/getGTFS")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Returns Rail GTFS-RT alerts as protobuf binary
|
|
12
|
+
def alerts
|
|
13
|
+
client.post_form_raw("/api/GTFSRT/getAlerts")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Returns Rail GTFS-RT trip updates as protobuf binary
|
|
17
|
+
def trip_updates
|
|
18
|
+
client.post_form_raw("/api/GTFSRT/getTripUpdates")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Returns Rail GTFS-RT vehicle positions as protobuf binary
|
|
22
|
+
def vehicle_positions
|
|
23
|
+
client.post_form_raw("/api/GTFSRT/getVehiclePositions")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rake"
|
|
4
|
+
|
|
5
|
+
namespace :njtransit do
|
|
6
|
+
namespace :gtfs do
|
|
7
|
+
desc "Import GTFS data from specified path"
|
|
8
|
+
task :import, [:path] do |_t, args|
|
|
9
|
+
require "njtransit"
|
|
10
|
+
|
|
11
|
+
path = args[:path]
|
|
12
|
+
if path.nil? || path.empty?
|
|
13
|
+
detected = NJTransit::GTFS.detect_gtfs_path
|
|
14
|
+
if detected
|
|
15
|
+
puts "No path specified. Detected GTFS data at: #{detected}"
|
|
16
|
+
print "Use this path? [Y/n] "
|
|
17
|
+
response = $stdin.gets&.strip&.downcase
|
|
18
|
+
path = detected if response.nil? || response.empty? || response == "y"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if path.nil? || path.empty?
|
|
23
|
+
puts "Usage: rake njtransit:gtfs:import[/path/to/gtfs/data]"
|
|
24
|
+
exit 1
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
puts "Importing GTFS data from #{path}..."
|
|
28
|
+
NJTransit::GTFS.import(path, force: ENV["FORCE"] == "true")
|
|
29
|
+
status = NJTransit::GTFS.status
|
|
30
|
+
puts "Import complete!"
|
|
31
|
+
puts " Routes: #{status[:routes]}"
|
|
32
|
+
puts " Stops: #{status[:stops]}"
|
|
33
|
+
puts " Trips: #{status[:trips]}"
|
|
34
|
+
puts " Stop times: #{status[:stop_times]}"
|
|
35
|
+
puts " Database: #{status[:path]}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc "Show GTFS import status"
|
|
39
|
+
task :status do
|
|
40
|
+
require "njtransit"
|
|
41
|
+
|
|
42
|
+
status = NJTransit::GTFS.status
|
|
43
|
+
if status[:imported]
|
|
44
|
+
puts "GTFS Status: Imported"
|
|
45
|
+
puts " Database: #{status[:path]}"
|
|
46
|
+
puts " Routes: #{status[:routes]}"
|
|
47
|
+
puts " Stops: #{status[:stops]}"
|
|
48
|
+
puts " Trips: #{status[:trips]}"
|
|
49
|
+
puts " Stop times: #{status[:stop_times]}"
|
|
50
|
+
puts " Imported at: #{status[:imported_at]}"
|
|
51
|
+
puts " Source: #{status[:source_path]}"
|
|
52
|
+
else
|
|
53
|
+
puts "GTFS Status: Not imported"
|
|
54
|
+
puts " Database path: #{status[:path]}"
|
|
55
|
+
detected = NJTransit::GTFS.detect_gtfs_path
|
|
56
|
+
puts " Detected GTFS data: #{detected}" if detected
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
desc "Clear GTFS database"
|
|
61
|
+
task :clear do
|
|
62
|
+
require "njtransit"
|
|
63
|
+
|
|
64
|
+
print "Are you sure you want to clear the GTFS database? [y/N] "
|
|
65
|
+
response = $stdin.gets&.strip&.downcase
|
|
66
|
+
if response == "y"
|
|
67
|
+
NJTransit::GTFS.clear!
|
|
68
|
+
puts "GTFS database cleared."
|
|
69
|
+
else
|
|
70
|
+
puts "Cancelled."
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
data/lib/njtransit.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "njtransit/version"
|
|
4
|
+
require_relative "njtransit/configuration"
|
|
5
|
+
require_relative "njtransit/error"
|
|
6
|
+
require_relative "njtransit/client"
|
|
7
|
+
require_relative "njtransit/gtfs"
|
|
8
|
+
|
|
9
|
+
module NJTransit
|
|
10
|
+
class << self
|
|
11
|
+
def configure
|
|
12
|
+
yield(configuration)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def configuration
|
|
16
|
+
@configuration ||= Configuration.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Bus API client (pcsdata.njtransit.com)
|
|
20
|
+
def client
|
|
21
|
+
@client ||= Client.new(**configuration.to_h)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Rail API client (raildata.njtransit.com)
|
|
25
|
+
def rail_client
|
|
26
|
+
@rail_client ||= Client.new(
|
|
27
|
+
**configuration.to_h, base_url: Configuration::DEFAULT_RAIL_BASE_URL,
|
|
28
|
+
auth_path: "/api/TrainData/getToken"
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def reset!
|
|
33
|
+
@configuration = nil
|
|
34
|
+
@client = nil
|
|
35
|
+
@rail_client = nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
require_relative "njtransit/railtie" if defined?(Rails::Railtie)
|
data/sig/njtransit.rbs
ADDED
metadata
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: njtransit
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Jay Ravaliya
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-03-27 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: faraday
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: faraday-multipart
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: faraday-typhoeus
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1'
|
|
48
|
+
- - "<"
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: '3'
|
|
51
|
+
type: :runtime
|
|
52
|
+
prerelease: false
|
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
54
|
+
requirements:
|
|
55
|
+
- - ">="
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: '1'
|
|
58
|
+
- - "<"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '3'
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: sequel
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '5.0'
|
|
68
|
+
type: :runtime
|
|
69
|
+
prerelease: false
|
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '5.0'
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: sqlite3
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '2.0'
|
|
82
|
+
type: :runtime
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '2.0'
|
|
89
|
+
- !ruby/object:Gem::Dependency
|
|
90
|
+
name: typhoeus
|
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '1.4'
|
|
96
|
+
type: :runtime
|
|
97
|
+
prerelease: false
|
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '1.4'
|
|
103
|
+
description: A developer-friendly Ruby gem for interacting with NJTransit's API. Provides
|
|
104
|
+
access to stations, routes, schedules, real-time arrivals, and more.
|
|
105
|
+
email:
|
|
106
|
+
- jayrav13@gmail.com
|
|
107
|
+
executables: []
|
|
108
|
+
extensions: []
|
|
109
|
+
extra_rdoc_files: []
|
|
110
|
+
files:
|
|
111
|
+
- ".claude/commands/njtransit.md"
|
|
112
|
+
- ".mcp.json.example"
|
|
113
|
+
- ".mcp.json.sample"
|
|
114
|
+
- ".rspec"
|
|
115
|
+
- ".rubocop.yml"
|
|
116
|
+
- ".ruby-version"
|
|
117
|
+
- CHANGELOG.md
|
|
118
|
+
- CLAUDE.md
|
|
119
|
+
- CODE_OF_CONDUCT.md
|
|
120
|
+
- LICENSE.txt
|
|
121
|
+
- README.md
|
|
122
|
+
- Rakefile
|
|
123
|
+
- docs/plans/2025-01-24-njtransit-gem-design.md
|
|
124
|
+
- docs/plans/2026-01-24-bus-api-design.md
|
|
125
|
+
- docs/plans/2026-01-24-gtfs-implementation.md
|
|
126
|
+
- docs/plans/2026-01-24-gtfs-loader-design.md
|
|
127
|
+
- docs/superpowers/plans/2026-03-26-dev-infra-and-agent.md
|
|
128
|
+
- lefthook.yml
|
|
129
|
+
- lib/njtransit.rb
|
|
130
|
+
- lib/njtransit/client.rb
|
|
131
|
+
- lib/njtransit/configuration.rb
|
|
132
|
+
- lib/njtransit/error.rb
|
|
133
|
+
- lib/njtransit/gtfs.rb
|
|
134
|
+
- lib/njtransit/gtfs/database.rb
|
|
135
|
+
- lib/njtransit/gtfs/importer.rb
|
|
136
|
+
- lib/njtransit/gtfs/models/route.rb
|
|
137
|
+
- lib/njtransit/gtfs/models/stop.rb
|
|
138
|
+
- lib/njtransit/gtfs/queries/routes_between.rb
|
|
139
|
+
- lib/njtransit/gtfs/queries/schedule.rb
|
|
140
|
+
- lib/njtransit/railtie.rb
|
|
141
|
+
- lib/njtransit/resources/base.rb
|
|
142
|
+
- lib/njtransit/resources/bus.rb
|
|
143
|
+
- lib/njtransit/resources/bus/enrichment.rb
|
|
144
|
+
- lib/njtransit/resources/bus_gtfs.rb
|
|
145
|
+
- lib/njtransit/resources/rail.rb
|
|
146
|
+
- lib/njtransit/resources/rail_gtfs.rb
|
|
147
|
+
- lib/njtransit/tasks.rb
|
|
148
|
+
- lib/njtransit/version.rb
|
|
149
|
+
- sig/njtransit.rbs
|
|
150
|
+
homepage: https://github.com/jayrav13/njtransit
|
|
151
|
+
licenses:
|
|
152
|
+
- MIT
|
|
153
|
+
metadata:
|
|
154
|
+
homepage_uri: https://github.com/jayrav13/njtransit
|
|
155
|
+
source_code_uri: https://github.com/jayrav13/njtransit
|
|
156
|
+
changelog_uri: https://github.com/jayrav13/njtransit/blob/main/CHANGELOG.md
|
|
157
|
+
rubygems_mfa_required: 'true'
|
|
158
|
+
post_install_message:
|
|
159
|
+
rdoc_options: []
|
|
160
|
+
require_paths:
|
|
161
|
+
- lib
|
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - ">="
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: 3.2.0
|
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
|
+
requirements:
|
|
169
|
+
- - ">="
|
|
170
|
+
- !ruby/object:Gem::Version
|
|
171
|
+
version: '0'
|
|
172
|
+
requirements: []
|
|
173
|
+
rubygems_version: 3.4.1
|
|
174
|
+
signing_key:
|
|
175
|
+
specification_version: 4
|
|
176
|
+
summary: Ruby client for the NJTransit API
|
|
177
|
+
test_files: []
|