Module: TypeSpecFromSerializers

Defined in:
lib/typespec_from_serializers/dsl.rb,
lib/typespec_from_serializers/version.rb,
lib/typespec_from_serializers/generator.rb

Overview

Public: Automatically generates TypeSpec descriptions for Ruby serializers and Rails routes.

Defined Under Namespace

Modules: DSL, SerializerRefinements Classes: Changes, Config, Interface, Operation, Property, Railtie, Resource

Constant Summary collapse

VERSION =

Public: This library adheres to semantic versioning.

"0.1.1"
DEFAULT_TRANSFORM_KEYS =
->(key) { key.camelize(:lower).chomp("?") }

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.force_generationObject (readonly)

Returns the value of attribute force_generation.



304
305
306
# File 'lib/typespec_from_serializers/generator.rb', line 304

def force_generation
  @force_generation
end

Class Method Details

.configObject

Public: Configuration of the code generator.



307
308
309
310
311
# File 'lib/typespec_from_serializers/generator.rb', line 307

def config
  (@config ||= default_config(root)).tap do |config|
    yield(config) if block_given?
  end
end

.generate(force: ) ⇒ Object

Public: Generates code for all serializers in the app.



314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
# File 'lib/typespec_from_serializers/generator.rb', line 314

def generate(force: ENV["SERIALIZER_TYPESPEC_FORCE"])
  @force_generation = force
  config.output_dir.rmtree if force && config.output_dir.exist?

  if config.namespace
    load_serializers(all_serializer_files) if force
  else
    generate_index_file
  end

  generate_routes

  loaded_serializers.each do |serializer|
    generate_model_for(serializer)
  end
end

.generate_changedObject



331
332
333
334
335
336
337
338
# File 'lib/typespec_from_serializers/generator.rb', line 331

def generate_changed
  if changes.updated?
    config.output_dir.rmtree if changes.any_removed?
    load_serializers(changes.modified_files)
    generate
    changes.clear
  end
end

.generate_index_fileObject

Internal: Allows to import all serializer types from a single file.



350
351
352
353
354
355
356
# File 'lib/typespec_from_serializers/generator.rb', line 350

def generate_index_file
  cache_key = all_serializer_files.map { |file| file.delete_prefix(root.to_s) }.join
  write_if_changed(filename: "index", cache_key: cache_key) {
    load_serializers(all_serializer_files)
    serializers_index_content(loaded_serializers)
  }
end

.generate_model_for(serializer) ⇒ Object

Internal: Defines a TypeSpec model for the serializer.



341
342
343
344
345
346
347
# File 'lib/typespec_from_serializers/generator.rb', line 341

def generate_model_for(serializer)
  model = serializer.tsp_model

  write_if_changed(filename: "models/#{model.filename}", cache_key: model.inspect, extension: "tsp") {
    serializer_model_content(model)
  }
end

.generate_routesObject

Internal: Generates TypeSpec routes from Rails routes



359
360
361
362
363
364
365
366
367
# File 'lib/typespec_from_serializers/generator.rb', line 359

def generate_routes
  return unless defined?(Rails) && Rails.application

  routes = collect_rails_routes
  cache_key = routes.map { |r| r.operations.map { |op| "#{op.method}#{r.path}#{op.action}" }.join }.join
  write_if_changed(filename: "routes", cache_key: cache_key) {
    routes_content(routes)
  }
end

.skip_serializer?(serializer) ⇒ Boolean

Internal: Checks if it should avoid generating an model.

Returns:

  • (Boolean)


370
371
372
373
# File 'lib/typespec_from_serializers/generator.rb', line 370

def skip_serializer?(serializer)
  serializer.name.in?(config.base_serializers) ||
    config.skip_serializer_if.call(serializer)
end

.track_changesObject

Internal: Returns an object compatible with FileUpdateChecker.



376
377
378
# File 'lib/typespec_from_serializers/generator.rb', line 376

def track_changes
  changes
end