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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.claude/commands/njtransit.md +196 -0
  3. data/.mcp.json.example +12 -0
  4. data/.mcp.json.sample +11 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +87 -0
  7. data/.ruby-version +1 -0
  8. data/CHANGELOG.md +37 -0
  9. data/CLAUDE.md +159 -0
  10. data/CODE_OF_CONDUCT.md +84 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +148 -0
  13. data/Rakefile +12 -0
  14. data/docs/plans/2025-01-24-njtransit-gem-design.md +112 -0
  15. data/docs/plans/2026-01-24-bus-api-design.md +119 -0
  16. data/docs/plans/2026-01-24-gtfs-implementation.md +2216 -0
  17. data/docs/plans/2026-01-24-gtfs-loader-design.md +351 -0
  18. data/docs/superpowers/plans/2026-03-26-dev-infra-and-agent.md +480 -0
  19. data/lefthook.yml +17 -0
  20. data/lib/njtransit/client.rb +291 -0
  21. data/lib/njtransit/configuration.rb +49 -0
  22. data/lib/njtransit/error.rb +50 -0
  23. data/lib/njtransit/gtfs/database.rb +145 -0
  24. data/lib/njtransit/gtfs/importer.rb +124 -0
  25. data/lib/njtransit/gtfs/models/route.rb +59 -0
  26. data/lib/njtransit/gtfs/models/stop.rb +63 -0
  27. data/lib/njtransit/gtfs/queries/routes_between.rb +62 -0
  28. data/lib/njtransit/gtfs/queries/schedule.rb +75 -0
  29. data/lib/njtransit/gtfs.rb +119 -0
  30. data/lib/njtransit/railtie.rb +9 -0
  31. data/lib/njtransit/resources/base.rb +35 -0
  32. data/lib/njtransit/resources/bus/enrichment.rb +105 -0
  33. data/lib/njtransit/resources/bus.rb +95 -0
  34. data/lib/njtransit/resources/bus_gtfs.rb +34 -0
  35. data/lib/njtransit/resources/rail.rb +47 -0
  36. data/lib/njtransit/resources/rail_gtfs.rb +27 -0
  37. data/lib/njtransit/tasks.rb +74 -0
  38. data/lib/njtransit/version.rb +5 -0
  39. data/lib/njtransit.rb +40 -0
  40. data/sig/njtransit.rbs +4 -0
  41. 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NJTransit
4
+ VERSION = "1.0.0"
5
+ 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
@@ -0,0 +1,4 @@
1
+ module Njtransit
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
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: []