class ActiveFacts::Generators::Ruby

Options are comma or space separated:

Public Class Methods

compatibility() click to toggle source
# File lib/activefacts/generator/ruby.rb, line 23
def self.compatibility
  [1, %i{binary}]
end
new(constellation, composition, options = {}) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 27
def initialize constellation, composition, options = {}
  super
  @scope = options.delete('scope') || ''
  @scope = @scope.split(/::/)
  @scope_prefix = '  '*@scope.size
end
options() click to toggle source
# File lib/activefacts/generator/ruby.rb, line 15
def self.options
  super.merge(
    {
      scope: [String, "Generate a Ruby module that's nested inside the module you name here"]
    }
  )
end

Public Instance Methods

class_finale(object_type) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 62
def class_finale(object_type)
  "  end\n"
end
class_prelude(object_type, supertype) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 57
def class_prelude(object_type, supertype)
  global_qualifier = object_type == supertype ? ('::') : ''
  "  class #{object_type.name.words.capcase}" + (supertype ? (" < #{global_qualifier}#{supertype.name.words.capcase}") : '') + "\n"
end
comment(component) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 129
def comment component
  super
end
finale() click to toggle source
# File lib/activefacts/generator/ruby.rb, line 40
def finale
  @scope.size.downto(0).map{|i| '  '*i+"end\n"}*''
end
generate_classes(composites) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 44
def generate_classes composites
  super(composites).
    gsub(/^/, '  '*@scope.size)
end
identified_by_roles(identifying_roles) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 49
def identified_by_roles identifying_roles
  "    identified_by   #{ identifying_roles.map{|m| ':'+ruby_role_name(m) }*', ' }\n"
end
prelude(composition) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 34
def prelude composition
  "require 'activefacts/api'\n\n" +
  (0...@scope.size).map{|i| '  '*i + "module #{@scope[i]}\n"}*'' +
  "#{@scope_prefix}module #{composition.name.words.capcase}\n"
end
role_definition(component) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 66
def role_definition component
  role_name = ruby_role_name component

  # Is the role mandatory?
  mandatory = component.is_mandatory ? ', mandatory: true' : ''

  # Does the role name imply the matching class name?
  if component.is_a?(MM::Absorption) and
      counterpart = component.object_type and
      counterpart_composite = composite_for(counterpart)
    counterpart_class_emitted = @composites_finished[counterpart_composite]

    counterpart_class_name = ruby_class_name counterpart_composite
    counterpart_default_role = ruby_role_name counterpart_composite.mapping
    rolename_implies_class = role_name.words.capcase == counterpart_class_name
    class_ref = counterpart_class_emitted ? counterpart_class_name : counterpart_class_name.inspect
    class_spec = rolename_implies_class ? '' : ", class: #{class_ref}"

    # Does the reverse role need explicit specification?
    implied_reverse_role_name = ruby_role_name(component.root.mapping)
    actual_reverse_role_name = ruby_role_name(component.reverse_mapping || component.forward_mapping)

    if implied_reverse_role_name != actual_reverse_role_name
      counterpart_spec = ", counterpart: :#{actual_reverse_role_name}"
    elsif !rolename_implies_class
      # _as_XYZ is added where the forward role does not imply the class, and :counterpart role name is not specified
      actual_reverse_role_name += "_as_#{role_name}"
    end
    all = component.child_role.is_unique ? '' : 'all_'
    see = ", see #{counterpart_class_name}\##{all+actual_reverse_role_name}"
  end

  counterpart_comment = "# #{comment component}#{see}"

  definition =
    "    #{role_specifier component}"
  definition += ' '*(20-definition.length) if definition.length < 20
  definition += ":#{ruby_role_name component}#{mandatory}#{class_spec}#{counterpart_spec}  "
  definition += ' '*(56-definition.length) if definition.length < 56
  definition += "#{counterpart_comment}"
  definition += "\n"
end
role_specifier(component) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 109
def role_specifier component
  if component.is_a?(MM::Indicator)
    'maybe'
  else
    if component.is_a?(MM::Absorption) and component.child_role.is_unique
      'one_to_one'
    else
      'has_one'
    end
  end
end
ruby_class_name(composite) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 125
def ruby_class_name composite
  composite.mapping.name.words.capcase
end
ruby_role_name(component) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 121
def ruby_role_name component
  component.name.words.snakecase
end
value_type_declaration(object_type) click to toggle source
# File lib/activefacts/generator/ruby.rb, line 53
def value_type_declaration object_type
  "    value_type#{object_type.length ? "      length: #{object_type.length}" : ''}\n"    # REVISIT: Add other parameters and value restrictions
end