ninoxe 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +49 -0
  4. data/app/assets/javascripts/ninoxe/application.js +15 -0
  5. data/app/assets/stylesheets/ninoxe/application.css +13 -0
  6. data/app/controllers/ninoxe/application_controller.rb +4 -0
  7. data/app/helpers/ninoxe/application_helper.rb +4 -0
  8. data/app/models/chouette/access_link.rb +63 -0
  9. data/app/models/chouette/access_point.rb +145 -0
  10. data/app/models/chouette/access_point_type.rb +50 -0
  11. data/app/models/chouette/active_record.rb +66 -0
  12. data/app/models/chouette/area_type.rb +56 -0
  13. data/app/models/chouette/chouette_structure.dump +3417 -0
  14. data/app/models/chouette/command.rb +93 -0
  15. data/app/models/chouette/command_line_support.rb +35 -0
  16. data/app/models/chouette/company.rb +19 -0
  17. data/app/models/chouette/connection_link.rb +43 -0
  18. data/app/models/chouette/connection_link_type.rb +51 -0
  19. data/app/models/chouette/direction.rb +60 -0
  20. data/app/models/chouette/exporter.rb +32 -0
  21. data/app/models/chouette/file_validator.rb +47 -0
  22. data/app/models/chouette/group_of_line.rb +30 -0
  23. data/app/models/chouette/journey_pattern.rb +63 -0
  24. data/app/models/chouette/line.rb +65 -0
  25. data/app/models/chouette/link_orientation_type.rb +49 -0
  26. data/app/models/chouette/loader.rb +110 -0
  27. data/app/models/chouette/network.rb +33 -0
  28. data/app/models/chouette/object_id.rb +36 -0
  29. data/app/models/chouette/pt_link.rb +39 -0
  30. data/app/models/chouette/route.rb +158 -0
  31. data/app/models/chouette/stop_area.rb +273 -0
  32. data/app/models/chouette/stop_point.rb +33 -0
  33. data/app/models/chouette/time_table.rb +146 -0
  34. data/app/models/chouette/time_table_date.rb +14 -0
  35. data/app/models/chouette/time_table_period.rb +26 -0
  36. data/app/models/chouette/time_table_vehicle_journey.rb +5 -0
  37. data/app/models/chouette/transport_mode.rb +71 -0
  38. data/app/models/chouette/trident_active_record.rb +97 -0
  39. data/app/models/chouette/vehicle_journey.rb +101 -0
  40. data/app/models/chouette/vehicle_journey_at_stop.rb +45 -0
  41. data/app/models/chouette/wayback.rb +50 -0
  42. data/app/views/layouts/ninoxe/application.html.erb +14 -0
  43. data/config/database.yml +9 -0
  44. data/config/database.yml.ci +14 -0
  45. data/config/database.yml.travis +9 -0
  46. data/config/locales/en.yml +15 -0
  47. data/config/locales/fr.yml +16 -0
  48. data/config/routes.rb +2 -0
  49. data/db/migrate/20120213131553_create_chouette_line.rb +26 -0
  50. data/db/migrate/20120214101458_create_chouette_company.rb +25 -0
  51. data/db/migrate/20120214101645_create_chouette_ptnetwork.rb +24 -0
  52. data/db/migrate/20120406144221_create_chouette_stop_area.rb +33 -0
  53. data/db/migrate/20120411144209_create_time_table.rb +38 -0
  54. data/db/migrate/20120425064403_create_chouette_route.rb +22 -0
  55. data/db/migrate/20120425123944_create_chouette_stop_point.rb +17 -0
  56. data/db/migrate/20120426114527_create_chouette_connection_link.rb +28 -0
  57. data/db/migrate/20120521073709_create_chouette_journey_pattern.rb +26 -0
  58. data/db/migrate/20120521073723_create_chouette_journey_pattern_stop_point.rb +14 -0
  59. data/db/migrate/20120521073740_create_chouette_time_slot.rb +22 -0
  60. data/db/migrate/20120521073746_create_chouette_vehicle_journey.rb +34 -0
  61. data/db/migrate/20120521073758_create_chouette_vehicle_journey_at_stop.rb +25 -0
  62. data/db/migrate/20120521073900_create_chouette_time_table_vehicle_journey.rb +16 -0
  63. data/db/migrate/20120521132304_create_chouette_access_point.rb +34 -0
  64. data/db/migrate/20120521132313_create_chouette_access_link.rb +33 -0
  65. data/db/migrate/20120521132429_create_chouette_facility.rb +34 -0
  66. data/db/migrate/20120521132502_create_chouette_facility_feature.rb +12 -0
  67. data/db/migrate/20120521132551_create_chouette_group_of_line.rb +18 -0
  68. data/db/migrate/20120521132600_create_chouette_group_of_line_line.rb +12 -0
  69. data/db/migrate/20120521132656_create_chouette_routing_constrains_line.rb +12 -0
  70. data/db/migrate/20120521132724_create_chouette_stoparea_stoparea.rb +12 -0
  71. data/db/migrate/20120531091529_create_chouette_pt_link.rb +21 -0
  72. data/db/migrate/20120926141405_add_id_to_time_table_date.rb +12 -0
  73. data/db/migrate/20120926141415_add_id_to_time_table_period.rb +12 -0
  74. data/db/migrate/20121024072219_add_fields_to_access_points.rb +12 -0
  75. data/lib/chouette_factories.rb +1 -0
  76. data/lib/factories/chouette_access_links.rb +11 -0
  77. data/lib/factories/chouette_access_points.rb +8 -0
  78. data/lib/factories/chouette_companies.rb +5 -0
  79. data/lib/factories/chouette_connection_links.rb +11 -0
  80. data/lib/factories/chouette_group_of_lines.rb +4 -0
  81. data/lib/factories/chouette_journey_pattern.rb +32 -0
  82. data/lib/factories/chouette_lines.rb +20 -0
  83. data/lib/factories/chouette_networks.rb +5 -0
  84. data/lib/factories/chouette_routes.rb +18 -0
  85. data/lib/factories/chouette_stop_areas.rb +8 -0
  86. data/lib/factories/chouette_stop_points.rb +7 -0
  87. data/lib/factories/chouette_time_table.rb +21 -0
  88. data/lib/factories/chouette_vehicle_journey.rb +50 -0
  89. data/lib/factories/chouette_vehicle_journey_at_stop.rb +5 -0
  90. data/lib/ninoxe/engine.rb +15 -0
  91. data/lib/ninoxe/version.rb +3 -0
  92. data/lib/ninoxe.rb +7 -0
  93. metadata +251 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = Ninoxe {<img src="https://travis-ci.org/dryade/ninoxe.png?branch=master" alt="Build Status" />}[https://travis-ci.org/dryade/ninoxe] {<img src="https://codeclimate.com/badge.png" />}[https://codeclimate.com/github/dryade/ninoxe]
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
9
+ load 'rails/tasks/engine.rake'
10
+
11
+ Bundler::GemHelper.install_tasks
12
+
13
+ namespace :ci do
14
+ task :prepare do
15
+ cp "config/database.yml.ci", "config/database.yml"
16
+ end
17
+ task :travis do
18
+ cp "config/database.yml.travis", "config/database.yml"
19
+ end
20
+ task :build => ["db:migrate", "spec"]
21
+ end
22
+
23
+ begin
24
+ require 'rdoc/task'
25
+ rescue LoadError
26
+ require 'rdoc/rdoc'
27
+ require 'rake/rdoctask'
28
+ RDoc::Task = Rake::RDocTask
29
+ end
30
+
31
+ RDoc::Task.new(:rdoc) do |rdoc|
32
+ rdoc.rdoc_dir = 'rdoc'
33
+ rdoc.title = 'Ninoxe'
34
+ rdoc.options << '--line-numbers'
35
+ rdoc.rdoc_files.include('README.rdoc')
36
+ rdoc.rdoc_files.include('lib/**/*.rb')
37
+ end
38
+
39
+ require 'rspec/core'
40
+ require 'rspec/core/rake_task'
41
+
42
+ RSpec::Core::RakeTask.new(:spec)
43
+
44
+ task :spec => "app:db:test:prepare"
45
+
46
+ RSpec::Core::RakeTask.new(:rcov) do |t|
47
+ t.rcov = true
48
+ t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/,lib\/database_cleaner\/}
49
+ end
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,4 @@
1
+ module Ninoxe
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Ninoxe
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,63 @@
1
+ class Chouette::AccessLink < Chouette::TridentActiveRecord
2
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
3
+ set_primary_key :id
4
+
5
+ attr_accessor :access_link_type, :link_orientation_type, :link_key
6
+
7
+ attr_accessible :id, :access_link_type,:access_point_id, :stop_area_id
8
+ attr_accessible :objectid, :object_version, :creation_time, :creator_id, :name, :comment
9
+ attr_accessible :link_distance, :link_type, :default_duration, :frequent_traveller_duration, :occasional_traveller_duration
10
+ attr_accessible :mobility_restricted_traveller_duration, :mobility_restricted_suitability, :stairs_availability, :lift_availability, :int_user_needs
11
+ attr_accessible :link_orientation
12
+ attr_accessible :link_orientation_type, :stop_area
13
+
14
+ belongs_to :access_point, :class_name => 'Chouette::AccessPoint'
15
+ belongs_to :stop_area, :class_name => 'Chouette::StopArea'
16
+
17
+ validates_presence_of :name
18
+ validates_presence_of :link_type
19
+ validates_presence_of :link_orientation
20
+
21
+ def access_link_type
22
+ link_type && Chouette::ConnectionLinkType.new(link_type.underscore)
23
+ end
24
+
25
+ def access_link_type=(access_link_type)
26
+ self.link_type = (access_link_type ? access_link_type.camelcase : nil)
27
+ end
28
+
29
+ @@access_link_types = nil
30
+ def self.access_link_types
31
+ @@access_link_types ||= Chouette::ConnectionLinkType.all
32
+ end
33
+
34
+ def link_orientation_type
35
+ link_orientation && Chouette::LinkOrientationType.new(link_orientation.underscore)
36
+ end
37
+
38
+ def link_orientation_type=(link_orientation_type)
39
+ self.link_orientation = (link_orientation_type ? link_orientation_type.camelcase : nil)
40
+ end
41
+
42
+ @@link_orientation_types = nil
43
+ def self.link_orientation_types
44
+ @@link_orientation_types ||= Chouette::LinkOrientationType.all
45
+ end
46
+
47
+ def geometry
48
+ GeoRuby::SimpleFeatures::LineString.from_points( [ access_point.geometry, stop_area.geometry], 4326) if access_point.geometry and stop_area.geometry
49
+ end
50
+
51
+ def link_key
52
+ Chouette::AccessLink.build_link_key(access_point,stop_area,link_orientation_type)
53
+ end
54
+
55
+ def self.build_link_key(access_point,stop_area,link_orientation_type)
56
+ if link_orientation_type == "access_point_to_stop_area"
57
+ "A_#{access_point.id}-S_#{stop_area.id}"
58
+ else
59
+ "S_#{stop_area.id}-A_#{access_point.id}"
60
+ end
61
+ end
62
+ end
63
+
@@ -0,0 +1,145 @@
1
+ require 'geokit'
2
+ require 'geo_ruby'
3
+
4
+ class Chouette::AccessPoint < Chouette::TridentActiveRecord
5
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
6
+ set_primary_key :id
7
+ include Geokit::Mappable
8
+ has_many :access_links, :dependent => :destroy
9
+ belongs_to :stop_area
10
+
11
+ attr_accessor :access_point_type
12
+ attr_accessible :objectid, :object_version, :creation_time, :creator_id, :name, :comment
13
+ attr_accessible :longitude, :latitude, :long_lat_type, :x, :y, :projection_type
14
+ attr_accessible :country_code, :street_name
15
+ attr_accessible :openning_time, :closing_time, :access_type, :access_point_type
16
+ attr_accessible :mobility_restricted_suitability, :stairs_availability, :lift_availability
17
+ attr_accessible :stop_area_id
18
+
19
+ # workaround of ruby 1.8 private method y block attribute y reading access
20
+ def y
21
+ read_attribute :y
22
+ end
23
+
24
+ validates_presence_of :name
25
+ validates_presence_of :access_type
26
+
27
+ validates_presence_of :latitude, :if => :longitude
28
+ validates_presence_of :longitude, :if => :latitude
29
+ validates_numericality_of :latitude, :less_than_or_equal_to => 90, :greater_than_or_equal_to => -90, :allow_nil => true
30
+ validates_numericality_of :longitude, :less_than_or_equal_to => 180, :greater_than_or_equal_to => -180, :allow_nil => true
31
+
32
+ validates_presence_of :x, :if => :y
33
+ validates_presence_of :y, :if => :x
34
+ validates_numericality_of :x, :allow_nil => true
35
+ validates_numericality_of :y, :allow_nil => true
36
+
37
+ def self.nullable_attributes
38
+ [:street_name, :country_code, :comment, :projection_type, :long_lat_type, :x, :y]
39
+ end
40
+
41
+ def to_lat_lng
42
+ Geokit::LatLng.new(latitude, longitude) if latitude and longitude
43
+ end
44
+
45
+ def geometry
46
+ GeoRuby::SimpleFeatures::Point.from_lon_lat(longitude, latitude, 4326) if latitude and longitude
47
+ end
48
+
49
+ def geometry=(geometry)
50
+ geometry = geometry.to_wgs84
51
+ self.latitude, self.longitude, self.long_lat_type = geometry.lat, geometry.lng, "WGS84"
52
+ end
53
+
54
+ def position
55
+ geometry
56
+ end
57
+
58
+ def position=(position)
59
+ position = nil if String === position && position == ""
60
+ position = Geokit::LatLng.normalize(position), 4326 if String === position
61
+ self.latitude = position.lat
62
+ self.longitude = position.lng
63
+ end
64
+
65
+ def default_position
66
+ stop_area.geometry or stop_area.default_position
67
+ end
68
+
69
+
70
+ def access_point_type
71
+ access_type && Chouette::AccessPointType.new(access_type.underscore)
72
+ end
73
+
74
+ def access_point_type=(access_point_type)
75
+ self.access_type = (access_point_type ? access_point_type.camelcase : nil)
76
+ end
77
+
78
+ @@access_point_types = nil
79
+ def self.access_point_types
80
+ @@access_point_types ||= Chouette::AccessPointType.all.select do |access_point_type|
81
+ access_point_type.to_i >= 0
82
+ end
83
+ end
84
+
85
+ def generic_access_link_matrix
86
+ matrix = Array.new
87
+ hash = Hash.new
88
+ access_links.each do |link|
89
+ hash[link.link_key] = link
90
+ end
91
+ key=Chouette::AccessLink.build_link_key(self,stop_area,"access_point_to_stop_area")
92
+ if hash.has_key?(key)
93
+ matrix << hash[key]
94
+ else
95
+ link = Chouette::AccessLink.new
96
+ link.access_point = self
97
+ link.stop_area = stop_area
98
+ link.link_orientation_type = "access_point_to_stop_area"
99
+ matrix << link
100
+ end
101
+ key=Chouette::AccessLink.build_link_key(self,stop_area,"stop_area_to_access_point")
102
+ if hash.has_key?(key)
103
+ matrix << hash[key]
104
+ else
105
+ link = Chouette::AccessLink.new
106
+ link.access_point = self
107
+ link.stop_area = stop_area
108
+ link.link_orientation_type = "stop_area_to_access_point"
109
+ matrix << link
110
+ end
111
+ matrix
112
+ end
113
+
114
+ def detail_access_link_matrix
115
+ matrix = Array.new
116
+ hash = Hash.new
117
+ access_links.each do |link|
118
+ hash[link.link_key] = link
119
+ end
120
+ stop_area.children_at_base.each do |child|
121
+ key=Chouette::AccessLink.build_link_key(self,child,"access_point_to_stop_area")
122
+ if hash.has_key?(key)
123
+ matrix << hash[key]
124
+ else
125
+ link = Chouette::AccessLink.new
126
+ link.access_point = self
127
+ link.stop_area = child
128
+ link.link_orientation_type = "access_point_to_stop_area"
129
+ matrix << link
130
+ end
131
+ key=Chouette::AccessLink.build_link_key(self,child,"stop_area_to_access_point")
132
+ if hash.has_key?(key)
133
+ matrix << hash[key]
134
+ else
135
+ link = Chouette::AccessLink.new
136
+ link.access_point = self
137
+ link.stop_area = child
138
+ link.link_orientation_type = "stop_area_to_access_point"
139
+ matrix << link
140
+ end
141
+ end
142
+ matrix
143
+ end
144
+
145
+ end
@@ -0,0 +1,50 @@
1
+ class Chouette::AccessPointType < ActiveSupport::StringInquirer
2
+
3
+ def initialize(text_code, numerical_code)
4
+ super text_code.to_s
5
+ @numerical_code = numerical_code
6
+ end
7
+
8
+ def self.new(text_code, numerical_code = nil)
9
+ if text_code and numerical_code
10
+ super
11
+ elsif self === text_code
12
+ text_code
13
+ else
14
+ if Fixnum === text_code
15
+ text_code, numerical_code = definitions.rassoc(text_code)
16
+ else
17
+ text_code, numerical_code = definitions.assoc(text_code.to_s)
18
+ end
19
+
20
+ super text_code, numerical_code
21
+ end
22
+ end
23
+
24
+ def to_i
25
+ @numerical_code
26
+ end
27
+
28
+ def inspect
29
+ "#{to_s}/#{to_i}"
30
+ end
31
+
32
+ def name
33
+ camelize
34
+ end
35
+
36
+ @@definitions = [
37
+ ["in", 0],
38
+ ["out", 1],
39
+ ["in_out", 2]
40
+ ]
41
+ cattr_reader :definitions
42
+
43
+ @@all = nil
44
+ def self.all
45
+ @@all ||= definitions.collect do |text_code, numerical_code|
46
+ new(text_code, numerical_code)
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,66 @@
1
+ #require "active_record"
2
+
3
+ module Chouette
4
+ class ActiveRecord < ::ActiveRecord::Base
5
+
6
+ self.abstract_class = true
7
+
8
+ before_save :nil_if_blank
9
+
10
+ # to be overrided to set nullable attrs when empty
11
+ def self.nullable_attributes
12
+ []
13
+ end
14
+
15
+ def nil_if_blank
16
+ self.class.nullable_attributes.each { |attr| self[attr] = nil if self[attr].blank? }
17
+ end
18
+
19
+
20
+ def human_attribute_name(*args)
21
+ self.class.human_attribute_name(*args)
22
+ end
23
+
24
+ class << self
25
+ alias_method :create_reflection_without_chouette_naming, :create_reflection
26
+
27
+ def create_reflection(macro, name, options, active_record)
28
+ options =
29
+ Reflection.new(macro, name, options, active_record).options_with_default
30
+
31
+ create_reflection_without_chouette_naming(macro, name, options, active_record)
32
+ end
33
+ end
34
+
35
+
36
+
37
+ class Reflection
38
+
39
+ attr_reader :macro, :name, :options, :active_record
40
+
41
+ def initialize(macro, name, options, active_record)
42
+ @macro, @name, @options, @active_record = macro, name.to_s, options, active_record
43
+ end
44
+
45
+ def collection?
46
+ macro == :has_many
47
+ end
48
+
49
+ def singular_name
50
+ collection? ? name.singularize : name
51
+ end
52
+
53
+ def class_name
54
+ "Chouette::#{singular_name.camelize}"
55
+ end
56
+
57
+ def options_with_default
58
+ options.dup.tap do |options|
59
+ options[:class_name] ||= class_name
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,56 @@
1
+ class Chouette::AreaType < ActiveSupport::StringInquirer
2
+
3
+ def initialize(text_code, numerical_code)
4
+ super text_code.to_s
5
+ @numerical_code = numerical_code
6
+ end
7
+
8
+ def self.new(text_code, numerical_code = nil)
9
+ if text_code and numerical_code
10
+ super
11
+ elsif self === text_code
12
+ text_code
13
+ else
14
+ if Fixnum === text_code
15
+ text_code, numerical_code = definitions.rassoc(text_code)
16
+ else
17
+ text_code, numerical_code = definitions.assoc(text_code.to_s)
18
+ end
19
+
20
+ super text_code, numerical_code
21
+ end
22
+ end
23
+
24
+ def to_i
25
+ @numerical_code
26
+ end
27
+
28
+ def inspect
29
+ "#{to_s}/#{to_i}"
30
+ end
31
+
32
+ def name
33
+ if (to_s == 'itl')
34
+ to_s.upcase
35
+ else
36
+ camelize
37
+ end
38
+ end
39
+
40
+ @@definitions = [
41
+ ["boarding_position", 0],
42
+ ["quay", 1],
43
+ ["commercial_stop_point", 2],
44
+ ["stop_place", 3],
45
+ ["itl", 4]
46
+ ]
47
+ cattr_reader :definitions
48
+
49
+ @@all = nil
50
+ def self.all
51
+ @@all ||= definitions.collect do |text_code, numerical_code|
52
+ new(text_code, numerical_code)
53
+ end
54
+ end
55
+
56
+ end