af83/chouette-core

View on GitHub
app/lib/chouette/model_attribute.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Chouette
  class ModelAttribute
    attr_reader :model_class, :name, :options

    def self.code(model_class, name)
      "#{model_class.model_name.to_s.underscore}##{name}"
    end

    def self.collection(&block)
      Collection.new(&block)
    end

    # Returns the localized attribute name ("Nom", "Name", "Transporteur", etc)
    def human_name
      # Do not store the value (depend on the current locale)
      I18n.translate! name, scope: ['model_attribute', resource_name]
    rescue I18n::MissingTranslationData
      model_class.human_attribute_name(name)
    end

    def initialize(model_class, name, options = {})
      @model_class = model_class
      @name = name
      @options = options
    end

    # TODO: CHOUETTE-3266 remove?
    # "StopArea", "Line", "Entrance", ...
    def model_name
      @model_name ||= model_class.model_name.to_s
    end

    # TODO: CHOUETTE-3266 remove?
    # :stop_area, :line, :entrance, ...
    def resource_name
      @resource_name ||= model_name.underscore
    end

    # TODO: CHOUETTE-3266 only used once?
    # "stop_areas", "lines", "journey_patterns"
    def table_name
      # @table_name ||= model_class.reflections["#{name}"]&.klass&.table_name
      @table_name ||= model_class.table_name
    end

    # "stop_area#name", "line#name", ...
    def code
      @code ||= "#{resource_name}##{name}"
    end

    def ==(other)
      other && code == other.code
    end

    class Collection
      include Enumerable

      @@model_attributes = []
      cattr_reader :model_attributes
      attr_reader :selected_model_attributes

      def initialize(selected_model_attributes = [], &block)
        @selected_model_attributes = selected_model_attributes
        instance_exec(&block) if block_given?
      end

      def each(&block)
        selected_model_attributes.each(&block)
      end

      def self.define(model_class, name, options = {})
        @@model_attributes << ModelAttribute.new(model_class, name, options)
      end

      def select(model_class, name)
        selected_model_attribute = @@model_attributes.find { |m| m.code == ModelAttribute.code(model_class, name) }
        if selected_model_attribute
          selected_model_attributes << selected_model_attribute
        else
          Rails.logger.error "Selected Model attribute with class #{model_class} and name #{name} doesn't exist in the list"
        end
      end

      # TODO: CHOUETTE-3266 always used with model_name and name, maybe make an optimized version
      def find_by(attributes)
        find do |model_attribute|
          attributes.all? do |k, v|
            model_attribute.send(k).to_s == v.to_s
          end
        end
      end

      # Chouette::Line
      define Chouette::Line, :name
      define Chouette::Line, :active_from
      define Chouette::Line, :active_until
      define Chouette::Line, :color
      define Chouette::Line, :company
      define Chouette::Line, :secondary_companies
      define Chouette::Line, :network
      define Chouette::Line, :number
      define Chouette::Line, :published_name
      define Chouette::Line, :registration_number
      define Chouette::Line, :text_color
      define Chouette::Line, :transport_mode
      define Chouette::Line, :transport_submode
      define Chouette::Line, :url
      define Chouette::Line, :routes

      # Chouette::Network
      define Chouette::Network, :name

      # Chouette::Company
      define Chouette::Company, :name
      define Chouette::Company, :short_name
      define Chouette::Company, :code
      define Chouette::Company, :customer_service_contact_email
      define Chouette::Company, :customer_service_contact_more
      define Chouette::Company, :customer_service_contact_name
      define Chouette::Company, :customer_service_contact_phone
      define Chouette::Company, :customer_service_contact_url
      define Chouette::Company, :default_contact_email
      define Chouette::Company, :default_contact_fax
      define Chouette::Company, :default_contact_more
      define Chouette::Company, :default_contact_name
      define Chouette::Company, :default_contact_operating_department_name
      define Chouette::Company, :default_contact_organizational_unit
      define Chouette::Company, :default_contact_phone
      define Chouette::Company, :default_contact_url
      define Chouette::Company, :default_language
      define Chouette::Company, :private_contact_email
      define Chouette::Company, :private_contact_more
      define Chouette::Company, :private_contact_name
      define Chouette::Company, :private_contact_phone
      define Chouette::Company, :private_contact_url
      define Chouette::Company, :address_line_1
      define Chouette::Company, :address_line_2
      define Chouette::Company, :country_code
      define Chouette::Company, :house_number
      define Chouette::Company, :postcode
      define Chouette::Company, :postcode_extension
      define Chouette::Company, :registration_number
      define Chouette::Company, :street
      define Chouette::Company, :time_zone
      define Chouette::Company, :town

      # Chouette::StopArea
      define Chouette::StopArea, :name
      define Chouette::StopArea, :parent
      define Chouette::StopArea, :referent
      define Chouette::StopArea, :coordinates
      define Chouette::StopArea, :country_code
      define Chouette::StopArea, :street_name
      define Chouette::StopArea, :zip_code
      define Chouette::StopArea, :city_name
      define Chouette::StopArea, :url
      define Chouette::StopArea, :time_zone
      define Chouette::StopArea, :waiting_time
      define Chouette::StopArea, :postal_region
      define Chouette::StopArea, :public_code
      define Chouette::StopArea, :registration_number
      define Chouette::StopArea, :compass_bearing, data_type: :float
      define Chouette::StopArea, :accessibility_limitation_description
      define Chouette::StopArea, :escalator_free_accessibility
      define Chouette::StopArea, :lift_free_accessibility
      define Chouette::StopArea, :mobility_impaired_accessibility
      define Chouette::StopArea, :step_free_accessibility
      define Chouette::StopArea, :wheelchair_accessibility
      define Chouette::StopArea, :audible_signals_availability
      define Chouette::StopArea, :visual_signs_availability
      define Chouette::StopArea, :lines
      define Chouette::StopArea, :routes

      # Chouette::Route
      define Chouette::Route, :name
      define Chouette::Route, :published_name
      define Chouette::Route, :opposite_route
      define Chouette::Route, :journey_patterns
      define Chouette::Route, :vehicle_journeys
      define Chouette::Route, :stop_points
      define Chouette::Route, :wayback

      # Chouette::JourneyPattern
      define Chouette::JourneyPattern, :name
      define Chouette::JourneyPattern, :published_name
      define Chouette::JourneyPattern, :stop_points
      define Chouette::JourneyPattern, :vehicle_journeys
      define Chouette::JourneyPattern, :shape

      # Chouette::VehicleJourney
      define Chouette::VehicleJourney, :published_journey_name
      define Chouette::VehicleJourney, :company
      define Chouette::VehicleJourney, :transport_mode
      define Chouette::VehicleJourney, :published_journey_identifier
      define Chouette::VehicleJourney, :time_tables
      define Chouette::VehicleJourney, :transport_mode

      # Chouette::TimeTable
      define Chouette::TimeTable, :dates
      define Chouette::TimeTable, :periods

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

      # Chouette::RoutingConstraintZone
      define Chouette::RoutingConstraintZone, :name

      # Chouette::ConnectionLink
      define Chouette::ConnectionLink, :name

      # Document
      define Document, :name

      # Entrance
      define Entrance, :name
      define Entrance, :short_name
      define Entrance, :address_line_1 # rubocop:disable Naming/VariableNumber
      define Entrance, :zip_code
      define Entrance, :city_name
      define Entrance, :country

      # PointOfInterest::Base
      define PointOfInterest::Base, :name
      define PointOfInterest::Base, :url
      define PointOfInterest::Base, :address_line_1 # rubocop:disable Naming/VariableNumber
      define PointOfInterest::Base, :zip_code
      define PointOfInterest::Base, :city_name
      define PointOfInterest::Base, :country
      define PointOfInterest::Base, :email
      define PointOfInterest::Base, :phone
      define PointOfInterest::Base, :postal_region


      # Shape
      define Shape, :name

    end
  end
end