aboutsummaryrefslogtreecommitdiffstats
path: root/lib/model_attribute.rb
blob: 4880d24903b6b8c6667baf9784752d6974f965f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class ModelAttribute
  attr_reader :klass, :name, :data_type

  def self.all
    @__all__ ||= []
  end

  def self.grouped_options(type)
    {}.tap do |el|
      group_by_class.each do |key, values|
        values.reject!{ |x| x.data_type != type }
        el[I18n.t("activerecord.models.#{key}.one")] = values.map do |i|
          [
            I18n.t("activerecord.attributes.#{i.klass}.#{i.name}"),
            "#{i.klass}\##{i.name}"
          ]
        end
      end
    end
  end

  def self.define(klass, name, data_type)
    all << new(klass, name, data_type)
  end

  def self.classes
    all
      .map(&:klass)
      .uniq
      .map(&:to_s)
      .map(&:camelize)
  end

  def self.group_by_class
    all.group_by(&:klass)
  end

  def self.from_code(code)
    klass, name = code.split('#').map(&:to_sym)

    methods_by_class(klass).select do |model_attr|
      model_attr.name == name
    end.first
  end

  def self.methods_by_class(klass)
    all.select do |model_attr|
      model_attr.klass == klass
    end
  end

  def self.methods_by_class_and_type(klass, type)
    methods_by_class(klass).select do |model_attr|
      model_attr.data_type == type
    end
  end

  def initialize(klass, name, data_type)
    @klass = klass
    @name = name
    @data_type = data_type
  end

  # Chouette::Route
  define :route, :name, :string
  define :route, :published_name, :string
  define :route, :wayback, :string

  # Chouette::JourneyPattern
  define :journey_pattern, :name, :string
  define :journey_pattern, :published_name, :string
  define :journey_pattern, :registration_number, :string

  # Chouette::VehicleJourney
  define :vehicle_journey, :published_journey_name, :string
  define :vehicle_journey, :published_journey_identifier, :string
  define :vehicle_journey, :mobility_restricted_suitability, :boolean
  define :vehicle_journey, :flexible_service, :boolean

  # Chouette::Footnote
  define :footnote, :code, :string
  define :footnote, :label, :string

  # Chouette::RoutingConstraintZone
  define :routing_constraint_zone, :name, :string

  def code
    "#{@klass}##{@name}"
  end

  def ==(other)
    self.class === other &&
      klass == other.klass &&
      name == other.name &&
      data_type == other.data_type
  end
end