diff --git a/lib/generators/schemable/install_generator.rb b/lib/generators/schemable/install_generator.rb new file mode 100644 index 0000000..101de4a --- /dev/null +++ b/lib/generators/schemable/install_generator.rb @@ -0,0 +1,29 @@ +module Schemable + class InstallGenerator < Rails::Generators::Base + + source_root File.expand_path('../../templates', __dir__) + class_option :model_name, type: :string, default: 'Model', desc: 'Name of the model' + + def initialize(*) + super(*) + end + + def copy_initializer + target_path = 'spec/swagger/common_definitions.rb' + + if Rails.root.join(target_path).exist? + say_status('skipped', 'Common definitions already exists') + else + copy_file('common_definitions.rb', target_path) + end + + target_path = 'app/helpers/serializers_helper.rb' + + if Rails.root.join(target_path).exist? + say_status('skipped', 'Serializers helper already exists') + else + copy_file('serializers_helper.rb', target_path) + end + end + end +end diff --git a/lib/generators/schemable/model_generator.rb b/lib/generators/schemable/model_generator.rb new file mode 100644 index 0000000..deedad4 --- /dev/null +++ b/lib/generators/schemable/model_generator.rb @@ -0,0 +1,53 @@ +module Schemable + class ModelGenerator < Rails::Generators::Base + + source_root File.expand_path('../../templates', __dir__) + class_option :model_name, type: :string, default: 'Model', desc: 'Name of the model' + + def initialize(*) + super(*) + + @model_name = options[:model_name] + @model_name != 'Model' || raise('Model name is required') + end + + def copy_initializer + target_path = "lib/swagger/definitions/#{@model_name.underscore.downcase.singlurize}.rb" + + if Rails.root.join(target_path).exist? + say_status('skipped', 'Model definition already exists') + else + + create_file(target_path, <<-FILE +require './lib/swagger/concerns/schemable' + +module Swagger + module Definitions + class #{@model_name.classify} + + include Schemable + include SerializersHelper # This is a helper module that contains a method "serializers_map" that maps models to serializers + + attr_accessor :instance + + def initialize + @instance ||= JSONAPI::Serializable::Renderer.new.render(FactoryBot.create(:#{@model_name.underscore.downcase.singlurize}), class: serializers_map, include: []) + end + + def serializer + V1::#{@model_name.classify}Serializer + end + + def excluded_request_attributes + %i[id updatedAt createdAt] + end + end + end +end +FILE + ) + + end + end + end +end diff --git a/lib/templates/common_definitions.rb b/lib/templates/common_definitions.rb new file mode 100644 index 0000000..ef54eda --- /dev/null +++ b/lib/templates/common_definitions.rb @@ -0,0 +1,13 @@ +module SwaggerDefinitions + module CommonDefinitions + def self.aggregate + [ + # Import definitions like this: + # Swagger::Definitions::Model.definitions + + # Make sure in swagger_helper.rb's components section you have: + # schemas: SwaggerDefinitions::CommonDefinitions.aggregate + ].flatten.reduce({}, :merge) + end + end +end diff --git a/lib/templates/serializers_helper.rb b/lib/templates/serializers_helper.rb new file mode 100644 index 0000000..902740d --- /dev/null +++ b/lib/templates/serializers_helper.rb @@ -0,0 +1,7 @@ +module SerializersHelper + def serializers_map + { + # TheModel: V1::TheModelSerializer + }.freeze + end +end