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
-
.force_generation ⇒ Object
readonly
Returns the value of attribute force_generation.
Class Method Summary collapse
-
.config ⇒ Object
Public: Configuration of the code generator.
-
.generate(force: ) ⇒ Object
Public: Generates code for all serializers in the app.
- .generate_changed ⇒ Object
-
.generate_index_file ⇒ Object
Internal: Allows to import all serializer types from a single file.
-
.generate_model_for(serializer) ⇒ Object
Internal: Defines a TypeSpec model for the serializer.
-
.generate_routes ⇒ Object
Internal: Generates TypeSpec routes from Rails routes.
-
.skip_serializer?(serializer) ⇒ Boolean
Internal: Checks if it should avoid generating an model.
-
.track_changes ⇒ Object
Internal: Returns an object compatible with FileUpdateChecker.
Class Attribute Details
.force_generation ⇒ Object (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
.config ⇒ Object
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_changed ⇒ Object
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_file ⇒ Object
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_routes ⇒ Object
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.
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_changes ⇒ Object
Internal: Returns an object compatible with FileUpdateChecker.
376 377 378 |
# File 'lib/typespec_from_serializers/generator.rb', line 376 def track_changes changes end |