japan_etc 0.5.1 → 0.9.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.
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'japan_etc/database_provider/base'
4
+ require 'japan_etc/tollbooth'
5
+ require 'faraday'
6
+ require 'nokogiri'
7
+
8
+ module JapanETC
9
+ module DatabaseProvider
10
+ # http://www.nagoya-expressway.or.jp/etc/etc-lane.html
11
+ class PastDatabase < Base
12
+ def source_id
13
+ 'PastDatabase'
14
+ end
15
+
16
+ def fetch_tollbooths
17
+ rows.map do |row|
18
+ create_tollbooth_from_row(row)
19
+ end
20
+ end
21
+
22
+ def create_tollbooth_from_row(row)
23
+ identifier = Tollbooth::Identifier.from(row[0])
24
+
25
+ road = Road.new(row[1], row[2])
26
+
27
+ Tollbooth.new(
28
+ identifier: identifier,
29
+ road: road,
30
+ name: row[3],
31
+ direction: row[4],
32
+ entrance_or_exit: row[5],
33
+ note: row[6],
34
+ source: source_id,
35
+ priority: -1
36
+ )
37
+ end
38
+
39
+ def rows
40
+ CSV.parse(csv, headers: :first_row)
41
+ end
42
+
43
+ def csv
44
+ path = File.join(__dir__, 'past_database.csv')
45
+ File.read(path)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -5,6 +5,7 @@ require 'japan_etc/util'
5
5
 
6
6
  module JapanETC
7
7
  Road = Struct.new(:name, :route_name) do
8
+ include Comparable
8
9
  include Util
9
10
 
10
11
  IRREGULAR_ABBREVIATIONS = {
@@ -22,7 +23,7 @@ module JapanETC
22
23
  def initialize(name, route_name = nil)
23
24
  raise ValidationError, '#name cannot be nil' if name.nil?
24
25
 
25
- super(normalize(name), normalize(route_name))
26
+ super(remove_whitespaces(normalize(name)), remove_whitespaces(normalize(route_name)))
26
27
  end
27
28
 
28
29
  def abbreviation
@@ -49,5 +50,14 @@ module JapanETC
49
50
 
50
51
  abbreviation
51
52
  end
53
+
54
+ def <=>(other)
55
+ [:name, :route_name].each do |attribute|
56
+ result = send(attribute) <=> other.send(attribute)
57
+ return result unless result.zero?
58
+ end
59
+
60
+ 0
61
+ end
52
62
  end
53
63
  end
@@ -8,9 +8,11 @@ require 'japan_etc/util'
8
8
 
9
9
  module JapanETC
10
10
  class Tollbooth
11
+ include Comparable
11
12
  include Util
12
13
 
13
- attr_accessor :identifier, :road, :name, :entrance_or_exit, :direction, :notes
14
+ attr_accessor :identifier, :road, :name, :entrance_or_exit, :direction, :notes,
15
+ :source, :priority
14
16
 
15
17
  def self.create(
16
18
  road_number:,
@@ -20,23 +22,46 @@ module JapanETC
20
22
  name:,
21
23
  direction: nil,
22
24
  entrance_or_exit: nil,
23
- note: nil
25
+ note: nil,
26
+ source: nil,
27
+ priority: 0
24
28
  )
25
29
  identifier = Identifier.new(road_number, tollbooth_number)
26
30
  road = Road.new(road_name, route_name)
27
- new(identifier, road, name, direction, entrance_or_exit, note)
31
+
32
+ new(
33
+ identifier: identifier,
34
+ road: road,
35
+ name: name,
36
+ direction: direction,
37
+ entrance_or_exit: entrance_or_exit,
38
+ note: note,
39
+ source: source,
40
+ priority: priority
41
+ )
28
42
  end
29
43
 
30
- def initialize(identifier, road, name, direction = nil, entrance_or_exit = nil, note = nil) # rubocop:disable Metrics/LineLength
44
+ def initialize(
45
+ identifier:,
46
+ road:,
47
+ name:,
48
+ direction:,
49
+ entrance_or_exit:,
50
+ note:,
51
+ source:,
52
+ priority:
53
+ )
31
54
  raise ValidationError if identifier.nil? || road.nil? || name.nil?
32
55
 
33
56
  @identifier = identifier
34
57
  @road = road
35
- @name = normalize(name)
58
+ @name = remove_whitespaces(normalize(name))
36
59
  @direction = direction
37
60
  @entrance_or_exit = entrance_or_exit
38
61
  @notes = []
39
62
  notes << normalize(note) if note
63
+ @source = source
64
+ @priority = priority
40
65
 
41
66
  normalize!
42
67
  end
@@ -56,6 +81,24 @@ module JapanETC
56
81
  identifier.hash
57
82
  end
58
83
 
84
+ def <=>(other)
85
+ result = identifier <=> other.identifier
86
+ return result unless result.zero?
87
+
88
+ result = priority <=> other.priority
89
+ return -result unless result.zero? # Tollbooth with higher priority comes first
90
+
91
+ return -1 if !obsolete? && other.obsolete?
92
+ return 1 if obsolete? && !other.obsolete?
93
+
94
+ %i[road name source].each do |attribute|
95
+ result = send(attribute) <=> other.send(attribute)
96
+ return result unless result.zero?
97
+ end
98
+
99
+ 0
100
+ end
101
+
59
102
  def to_a
60
103
  [
61
104
  identifier.to_s,
@@ -63,10 +106,17 @@ module JapanETC
63
106
  name,
64
107
  direction,
65
108
  entrance_or_exit,
66
- notes.empty? ? nil : notes.join(' ')
109
+ notes.empty? ? nil : notes.join(' '),
110
+ source
67
111
  ].flatten
68
112
  end
69
113
 
114
+ def obsolete?
115
+ notes.any? { |note| note.include?('迄') }
116
+ end
117
+
118
+ private
119
+
70
120
  def normalize!
71
121
  extract_notes_from_name!
72
122
  extract_direction_from_notes!
@@ -180,8 +230,13 @@ module JapanETC
180
230
  end
181
231
 
182
232
  Identifier = Struct.new(:road_number, :tollbooth_number) do
233
+ include Comparable
183
234
  include Util
184
235
 
236
+ def self.from(string)
237
+ new(*string.split('-'))
238
+ end
239
+
185
240
  def initialize(road_number, tollbooth_number)
186
241
  road_number = convert_to_integer(road_number)
187
242
  raise ValidationError, '#road_number cannot be nil' if road_number.nil?
@@ -195,7 +250,11 @@ module JapanETC
195
250
  end
196
251
 
197
252
  def to_s
198
- format('%02d-%03d', road_number, tollbooth_number)
253
+ @string ||= format('%02d-%03d', road_number, tollbooth_number)
254
+ end
255
+
256
+ def <=>(other)
257
+ to_s <=> other.to_s
199
258
  end
200
259
  end
201
260
  end
@@ -7,7 +7,7 @@ module JapanETC
7
7
  def normalize(string)
8
8
  return nil unless string
9
9
 
10
- convert_fullwidth_characters_to_halfwidth(string).strip
10
+ convert_fullwidth_characters_to_halfwidth(string)
11
11
  end
12
12
 
13
13
  def convert_fullwidth_characters_to_halfwidth(string)
@@ -16,6 +16,12 @@ module JapanETC
16
16
  string.tr(' A-Za-z0-9', ' A-Za-z0-9')
17
17
  end
18
18
 
19
+ def remove_whitespaces(string)
20
+ return nil unless string
21
+
22
+ string.tr(' ', '')
23
+ end
24
+
19
25
  def convert_to_integer(object)
20
26
  case object
21
27
  when Numeric
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JapanETC
4
- VERSION = '0.5.1'
4
+ VERSION = '0.9.0'
5
5
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: japan_etc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Nakayama
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: faraday
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '0.15'
33
+ version: '1.0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '0.15'
40
+ version: '1.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: nokogiri
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -102,12 +116,16 @@ files:
102
116
  - japan_etc.gemspec
103
117
  - lib/japan_etc.rb
104
118
  - lib/japan_etc/database.rb
105
- - lib/japan_etc/database_provider.rb
106
119
  - lib/japan_etc/database_provider/base.rb
120
+ - lib/japan_etc/database_provider/base_nexco.rb
107
121
  - lib/japan_etc/database_provider/hanshin_expressway.rb
108
122
  - lib/japan_etc/database_provider/metropolitan_expressway.rb
109
123
  - lib/japan_etc/database_provider/nagoya_expressway.rb
110
- - lib/japan_etc/database_provider/nexco.rb
124
+ - lib/japan_etc/database_provider/nexco_central.rb
125
+ - lib/japan_etc/database_provider/nexco_east.rb
126
+ - lib/japan_etc/database_provider/nexco_west.rb
127
+ - lib/japan_etc/database_provider/past_database.csv
128
+ - lib/japan_etc/database_provider/past_database.rb
111
129
  - lib/japan_etc/direction.rb
112
130
  - lib/japan_etc/entrance_or_exit.rb
113
131
  - lib/japan_etc/error.rb
@@ -134,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
152
  - !ruby/object:Gem::Version
135
153
  version: '0'
136
154
  requirements: []
137
- rubygems_version: 3.0.3
155
+ rubygems_version: 3.1.2
138
156
  signing_key:
139
157
  specification_version: 4
140
158
  summary: Japan ETC (Electronic Toll Collection System) database
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'japan_etc/database_provider/metropolitan_expressway'
4
- require 'japan_etc/database_provider/hanshin_expressway'
5
- require 'japan_etc/database_provider/nagoya_expressway'
6
- require 'japan_etc/database_provider/nexco'