Class: Generate

Inherits:
Object
  • Object
show all
Defined in:
lib/crust/generate.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file_name, data, base_only) ⇒ Generate



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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

Instance Attribute Details

#file_nameObject

Returns the value of attribute file_name.



5
6
7
# File 'lib/crust/generate.rb', line 5

def file_name
  @file_name
end

Instance Method Details

#extends_class(data) ⇒ string



93
94
95
96
97
98
99
100
101
102
103
# 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) ⇒ array



123
124
125
126
127
128
129
130
131
132
# 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) ⇒ array



107
108
109
110
111
112
113
114
115
116
117
118
119
# 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_filesarray



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
# 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) ⇒ array



67
68
69
70
71
72
73
74
75
76
77
78
# 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) ⇒ array



53
54
55
56
57
58
59
60
61
62
63
# 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) ⇒ string



82
83
84
85
86
87
88
89
# 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) ⇒ string



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# 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) ⇒ boolean



136
137
138
# File 'lib/crust/generate.rb', line 136

def retained(type)
  type != 'NSInteger' && type != 'BOOL'
end

#snake_to_camel(file_name) ⇒ string



165
166
167
# 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