lib/ginny/models/class.rb in ginny-0.5.4 vs lib/ginny/models/class.rb in ginny-0.6.0
- old
+ new
@@ -20,19 +20,24 @@
# @return [Array<Ginny::Attr>]
attr_accessor :attrs
# String to write into the body of the class.
# @return [String]
attr_accessor :body
+ # If `true`, a method similar to [ActiveRecord::Base.create](https://apidock.com/rails/ActiveRecord/Persistence/ClassMethods/create) will be generated for the class.
+ # @return [Boolean]
+ attr_accessor :default_constructor
# String to prepend to the name of the generated file.
# @return [String]
attr_accessor :file_prefix
# @return [void]
def initialize()
self.attrs = []
self.modules = []
self.file_prefix = ""
+ self.body = ""
+ self.default_constructor = false
end
# Constructor for a Class. Use `create`, not `new`.
#
# @param args [Hash<Symbol>]
@@ -44,10 +49,11 @@
c.parent = args[:parent]
c.modules = args[:modules] unless args[:modules].nil?
c.attrs = Ginny::Attr.from_array(args[:attrs]) if args[:attrs]&.is_a?(Array)
c.body = args[:body] unless args[:body].nil?
c.file_prefix = args[:file_prefix] || ""
+ c.default_constructor = args[:default_constructor]
return c
end
# Write generated code out to a file.
#
@@ -65,19 +71,33 @@
def render()
parts = []
parts << (self.description&.length&.positive? ? self.description.comment.strip : nil)
parts << (self.parent.nil? ? "class #{self.class_name()}" : "class #{self.class_name()} < #{self.parent}")
parts << self.render_attributes()
- parts << (self.body&.length&.positive? ? self.body.indent(2) : nil)
+ parts << self.render_body()
+ # parts << (self.body&.length&.positive? ? self.body.indent(2) : nil)
parts << "end"
if self.modules.length > 0
body = parts.compact.join("\n").gsub(/([[:blank:]]+)$/, "")
return Ginny.mod(body, self.modules)
end
return parts.compact.join("\n").gsub(/([[:blank:]]+)$/, "")
end
+ # @return [String,nil]
+ def render_body()
+ if self.body.length > 0
+ if self.default_constructor
+ return ("\n" + self.constructor() + "\n\n" + self.body).indent(2)
+ end
+ return self.body.indent(2)
+ end
+ # binding.pry
+ return "\n" + self.constructor().indent(2) if self.default_constructor
+ return nil
+ end
+
# @return [String]
def render_attributes()
return nil unless self.attrs.length > 0
return self.attrs.map(&:render).join("\n").indent(2)
end
@@ -96,9 +116,23 @@
inflector = Dry::Inflector.new do |inflections|
inflections.plural("data", "data")
inflections.singular(/([t])a\z/i, '\1a')
end
return self.file_prefix + inflector.underscore(self.name) + ".rb"
+ end
+
+ # @return [String]
+ def constructor()
+ char = self.name.chr.downcase
+ body = "#{char} = #{self.class_name}.new\n"
+ body << self.attrs.map { |a| "#{char}.#{a.name} = params[:#{a.name}]\n" }.join()
+ body << "return #{char}\n"
+ Ginny::Func.create({
+ name: "self.create",
+ return_type: "self",
+ params: [{ name: "params", type: "Hash", default: {} }],
+ body: body,
+ }).render()
end
end
end