class Generate

Attributes

file_name[RW]

Public Class Methods

new(file_name, data, base_only) click to toggle source
# File lib/crust/generate.rb, line 7
def initialize(file_name, data, base_only)
  @file_name = file_name
  @data = data
  @base_only = base_only

  @generated_class = self.snake_to_camel(File.basename(file_name, '.json'))

  @properties = self.extract_properties(data['properties'])
  @variable_names = self.extract_variable_names(data['properties'].keys)
  @extends_class = self.extends_class(data)
  @import = self.get_import(data)
  @contains_classes = self.get_contains(data['properties'])
  @array_converters = self.get_array_converters(data['properties'])
end

Public Instance Methods

extends_class(data) click to toggle source

@param [hash] data @return [string]

# File lib/crust/generate.rb, line 93
def extends_class(data)
  if data['extends'].to_s == ''
    'MTLModel<MTLJSONSerializing>'
  else
    if data['extends'].is_a? String
      '_' << self.snake_to_camel(Pathname.new(data['extends']).basename('.json').to_s)
    else
      '_' << self.snake_to_camel(Pathname.new(data['extends']['$ref']).basename('.json').to_s)
    end
  end
end
extract_properties(properties) click to toggle source

@param [array] properties @return [array]

# File lib/crust/generate.rb, line 123
def extract_properties(properties)
  extracted_properties = []

  properties.each do |name, type_info|
    type = match_type(type_info['type'])
    extracted_properties << "@property(nonatomic#{self.retained(type) ? ', copy' : ''}, readonly) #{type} #{self.retained(type) ? '*' : ''}#{name};"
  end

  extracted_properties
end
extract_variable_names(keys) click to toggle source

@param [array] keys @return [array]

# File lib/crust/generate.rb, line 107
def extract_variable_names(keys)
  extracted_variables_names = []

  if keys.length > 1
    last = keys.pop
    keys.each { |key| extracted_variables_names << "@\"#{key}\" : @\"#{key}\"," }
    extracted_variables_names << "@\"#{last}\" : @\"#{last}\""
  else
    extracted_variables_names << "@\"#{keys[0]}\" : @\"#{keys[0]}\""
  end

  extracted_variables_names
end
generate_files() click to toggle source

@return [array]

# File lib/crust/generate.rb, line 23
def generate_files
  output = {}

  output["_#{@generated_class}.h"] = Mustache.render(File.read(File.dirname(__FILE__) + '/tpl/base_header.mustache'),
                                                     :class_name => @generated_class,
                                                     :extends_class => @extends_class,
                                                     :import => @import,
                                                     :description => @data['description'],
                                                     :properties => @properties)

  output["_#{@generated_class}.m"] = Mustache.render(File.read(File.dirname(__FILE__) + '/tpl/base_implementation.mustache'),
                                                     :class_name => @generated_class,
                                                     :properties => @variable_names,
                                                     :extends => !@import.nil?,
                                                     :contains => @contains_classes,
                                                     :array_converters => @array_converters)

  unless @base_only
    output["#{@generated_class}.h"] = Mustache.render(File.read(File.dirname(__FILE__) + '/tpl/header.mustache'),
                                                      :class_name => @generated_class)

    output["#{@generated_class}.m"] = Mustache.render(File.read(File.dirname(__FILE__) + '/tpl/implementation.mustache'),
                                                      :class_name => @generated_class)
  end

  output
end
get_array_converters(properties) click to toggle source

@param [array] properties @return [array]

# File lib/crust/generate.rb, line 67
def get_array_converters(properties)
  array_converters = []

  properties.each do |name, type_info|
    if match_type(type_info['type']) == 'NSArray' && type_info['items']['$ref'] != nil
      extends = type_info['items']['$ref'] != '#' ? self.snake_to_camel(Pathname.new(type_info['items']['$ref']).basename('.json').to_s) : @generated_class
      array_converters << "+ (NSValueTransformer *)#{name}JSONTransformer {\n    return [NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:_#{extends}.class];\n}"
    end
  end

  array_converters
end
get_contains(properties) click to toggle source

@param [array] properties @return [array]

# File lib/crust/generate.rb, line 53
def get_contains(properties)
  contains = []

  properties.each do |name, type_info|
    if match_type(type_info['type']) == 'NSArray' && type_info['items']['$ref'] != nil && type_info['items']['$ref'] != '#'
      contains << "#import \"_#{self.snake_to_camel(Pathname.new(type_info['items']['$ref']).basename('.json').to_s)}.h\""
    end
  end

  contains
end
get_import(data) click to toggle source

@param [hash] data @return [string]

# File lib/crust/generate.rb, line 82
def get_import(data)
  if data['extends'].to_s == ''
    nil
  else
    import = data['extends'].is_a?(String) ? '_' << self.snake_to_camel(data['extends'].sub('.json', '')) : '_' << self.snake_to_camel(File.basename(data['extends']['$ref'], '.json'))
    "#import \"#{import}.h\""
  end
end
match_type(in_type) click to toggle source

@param [string] in_type @return [string]

# File lib/crust/generate.rb, line 142
def match_type(in_type)
  case in_type
    when 'string'
      'NSString'
    when 'number', 'long'
      'NSNumber'
    when 'integer'
      'NSInteger'
    when 'boolean'
      'BOOL'
    when 'object', 'any'
      'NSObject'
    when 'array'
      'NSArray'
    when 'null'
      'NSNull'
    else
      'NSObject'
  end
end
retained(type) click to toggle source

@param [string] type @return [boolean]

# File lib/crust/generate.rb, line 136
def retained(type)
  type != 'NSInteger' && type != 'BOOL'
end
snake_to_camel(file_name) click to toggle source

@param [string] file_name @return [string]

# File lib/crust/generate.rb, line 165
def snake_to_camel(file_name)
  (file_name.split('_').length > 1) ? file_name.split('_').map { |w| w.capitalize }.join('') : file_name.capitalize
end