Class: GoaModelGen::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/goa_model_gen/generator.rb

Constant Summary collapse

GO_BASE_PATH =
File.expand_path('../templates/base.go.erb', __FILE__)
PACKAGE_FOR_IMPORT =
{
  "datastore" => "google.golang.org/appengine/datastore",
}
COLORS =
{
  blue:  "\e[34m",
  clear: "\e[0m",
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Generator

Returns a new instance of Generator.



18
19
20
21
22
23
# File 'lib/goa_model_gen/generator.rb', line 18

def initialize(config)
  @config = config
  @user_editable = false
  @force = false
  @skip = false
end

Instance Attribute Details

#configObject (readonly)

These are used in templates



12
13
14
# File 'lib/goa_model_gen/generator.rb', line 12

def config
  @config
end

#forceObject

Returns the value of attribute force.



15
16
17
# File 'lib/goa_model_gen/generator.rb', line 15

def force
  @force
end

#keep_editableObject

Returns the value of attribute keep_editable.



16
17
18
# File 'lib/goa_model_gen/generator.rb', line 16

def keep_editable
  @keep_editable
end

#skipObject

Returns the value of attribute skip.



15
16
17
# File 'lib/goa_model_gen/generator.rb', line 15

def skip
  @skip
end

#source_fileObject

Returns the value of attribute source_file.



14
15
16
# File 'lib/goa_model_gen/generator.rb', line 14

def source_file
  @source_file
end

#thorObject

Returns the value of attribute thor.



13
14
15
# File 'lib/goa_model_gen/generator.rb', line 13

def thor
  @thor
end

Instance Method Details

#clear_dependenciesObject



41
42
43
# File 'lib/goa_model_gen/generator.rb', line 41

def clear_dependencies
  @dependencies = nil
end

#dependenciesObject



37
38
39
# File 'lib/goa_model_gen/generator.rb', line 37

def dependencies
  @dependencies ||= {}
end

#generate(template_path, variables = {}) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/goa_model_gen/generator.rb', line 68

def generate(template_path, variables = {})
  clear_dependencies
  user_editable(value: false)

  abs_path = File.expand_path('../' + template_path, __FILE__)
  erb = ERB.new(File.read(abs_path), nil, "-")
  erb.filename = abs_path

  variables.each do |key, val|
    define_singleton_method(key){ val }
  end

  body = erb.result(binding).strip

  raise "No package given in #{abs_path}" if package.blank?

  base = ERB.new(File.read(GO_BASE_PATH), nil, "-")
  base.filename = GO_BASE_PATH
  r = base.result(binding).strip << "\n"
  r = gofmt(r) unless config.gofmt_disabled
  return r
end

#gofmt(content) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/goa_model_gen/generator.rb', line 91

def gofmt(content)
  # https://docs.ruby-lang.org/ja/2.5.0/class/IO.html#S_POPEN
  return IO.popen("gofmt", "r+") do |io|
    io.puts(content)
    io.close_write
    io.read
  end
end

#golang_helperObject



25
26
27
# File 'lib/goa_model_gen/generator.rb', line 25

def golang_helper
  @golang_helper ||= GolangHelper.new
end

#import(alias_or_package, package_or_nil = nil) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'lib/goa_model_gen/generator.rb', line 45

def import(alias_or_package, package_or_nil = nil)
  package = package_or_nil || alias_or_package
  new_alias = package_or_nil ? alias_or_package.to_s : nil
  if dependencies.key?(package)
    old_alias = dependencies[package]
    raise "Conflict alias #{old_alias.inspect} and #{new_alias.inspect}" if old_alias != new_alias
  end
  dependencies[package] ||= new_alias
end

#package(name = nil) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/goa_model_gen/generator.rb', line 29

def package(name = nil)
  if name
    @package = name
  else
    @package
  end
end

#process(temp_path_to_dest_path) ⇒ Object



117
118
119
# File 'lib/goa_model_gen/generator.rb', line 117

def process(temp_path_to_dest_path)
  temp_path_to_dest_path.each{|src, dest| run(src, dest) }
end

#run(template_path, output_path, variables = {}, &block) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/goa_model_gen/generator.rb', line 105

def run(template_path, output_path, variables = {}, &block)
  content = generate(template_path, variables, &block)

  if user_editable? && keep_editable && File.exist?(output_path)
    $stderr.puts("%sKEEP%s %s" % [COLORS[:blue], COLORS[:clear], output_path])
    return
  end

  options = {skip: skip, force: force}
  thor.create_file(output_path, content, options)
end

#user_editable(value: true) ⇒ Object



55
56
57
# File 'lib/goa_model_gen/generator.rb', line 55

def user_editable(value: true)
  @user_editable = value
end

#user_editable?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/goa_model_gen/generator.rb', line 58

def user_editable?
  @user_editable
end