typelizer 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -1
  3. data/README.md +75 -0
  4. data/lib/tasks/generate.rake +4 -4
  5. data/lib/typelizer/config.rb +37 -0
  6. data/lib/typelizer/configuration.rb +1 -2
  7. data/lib/typelizer/delegate_tracker.rb +34 -0
  8. data/lib/typelizer/dsl/hooks/alba.rb +17 -0
  9. data/lib/typelizer/dsl/hooks/ams.rb +15 -0
  10. data/lib/typelizer/dsl/hooks/oj_serializers.rb +15 -0
  11. data/lib/typelizer/dsl/hooks/panko.rb +16 -0
  12. data/lib/typelizer/dsl/hooks.rb +64 -0
  13. data/lib/typelizer/dsl.rb +20 -0
  14. data/lib/typelizer/generator.rb +2 -73
  15. data/lib/typelizer/interface.rb +60 -17
  16. data/lib/typelizer/model_plugins/active_record.rb +23 -0
  17. data/lib/typelizer/openapi.rb +124 -0
  18. data/lib/typelizer/property.rb +50 -10
  19. data/lib/typelizer/serializer_plugins/alba/trait_interface.rb +2 -2
  20. data/lib/typelizer/serializer_plugins/alba.rb +0 -23
  21. data/lib/typelizer/serializer_plugins/ams.rb +0 -13
  22. data/lib/typelizer/serializer_plugins/base.rb +0 -8
  23. data/lib/typelizer/serializer_plugins/oj_serializers.rb +0 -7
  24. data/lib/typelizer/serializer_plugins/panko.rb +0 -12
  25. data/lib/typelizer/templates/enums.ts.erb +1 -1
  26. data/lib/typelizer/templates/index.ts.erb +5 -3
  27. data/lib/typelizer/templates/inheritance.ts.erb +5 -1
  28. data/lib/typelizer/templates/inline_type.ts.erb +1 -1
  29. data/lib/typelizer/templates/interface.ts.erb +7 -6
  30. data/lib/typelizer/union_type_sorter.rb +148 -0
  31. data/lib/typelizer/version.rb +1 -1
  32. data/lib/typelizer/writer.rb +10 -4
  33. data/lib/typelizer.rb +31 -1
  34. metadata +9 -2
  35. data/lib/typelizer/contexts/scan_context.rb +0 -20
data/lib/typelizer.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "typelizer/version"
4
+ require_relative "typelizer/union_type_sorter"
4
5
  require_relative "typelizer/property"
5
6
  require_relative "typelizer/model_plugins/auto"
6
7
  require_relative "typelizer/serializer_plugins/auto"
@@ -10,12 +11,12 @@ require_relative "typelizer/configuration"
10
11
  require_relative "typelizer/serializer_config_layer"
11
12
 
12
13
  require_relative "typelizer/contexts/writer_context"
13
- require_relative "typelizer/contexts/scan_context"
14
14
  require_relative "typelizer/property_sorter"
15
15
  require_relative "typelizer/import_sorter"
16
16
  require_relative "typelizer/interface"
17
17
  require_relative "typelizer/renderer"
18
18
  require_relative "typelizer/writer"
19
+ require_relative "typelizer/openapi"
19
20
  require_relative "typelizer/generator"
20
21
  require_relative "typelizer/type_parser"
21
22
  require_relative "typelizer/dsl"
@@ -62,8 +63,35 @@ module Typelizer
62
63
  yield configuration
63
64
  end
64
65
 
66
+ def interfaces(writer_name: nil)
67
+ load_serializers
68
+ context = WriterContext.new(writer_name: writer_name)
69
+ target_serializers(context.writer_config.reject_class)
70
+ .map { |klass| context.interface_for(klass) }
71
+ .reject(&:empty?)
72
+ end
73
+
74
+ def openapi_schemas(writer_name: nil, openapi_version: "3.0")
75
+ interfaces(writer_name: writer_name).to_h { |i| [i.name, OpenAPI.schema_for(i, openapi_version: openapi_version)] }
76
+ end
77
+
65
78
  private
66
79
 
80
+ def load_serializers
81
+ dirs.flat_map { |dir| Dir["#{dir}/**/*.rb"] }.each { |file| require file }
82
+ end
83
+
84
+ def target_serializers(reject_class)
85
+ resolved = base_classes.filter_map do |base_class|
86
+ Object.const_get(base_class) if Object.const_defined?(base_class)
87
+ end
88
+ raise ArgumentError, "No serializers found. Please ensure all your serializers include Typelizer::DSL." if base_classes.any? && resolved.none?
89
+
90
+ (resolved + resolved.flat_map(&:descendants)).uniq
91
+ .reject { |serializer| reject_class.call(serializer: serializer) }
92
+ .sort_by(&:name)
93
+ end
94
+
67
95
  attr_writer :base_classes
68
96
  end
69
97
 
@@ -72,3 +100,5 @@ module Typelizer
72
100
 
73
101
  self.base_classes = Set.new
74
102
  end
103
+
104
+ require_relative "typelizer/delegate_tracker"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typelizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
@@ -50,9 +50,14 @@ files:
50
50
  - lib/typelizer.rb
51
51
  - lib/typelizer/config.rb
52
52
  - lib/typelizer/configuration.rb
53
- - lib/typelizer/contexts/scan_context.rb
54
53
  - lib/typelizer/contexts/writer_context.rb
54
+ - lib/typelizer/delegate_tracker.rb
55
55
  - lib/typelizer/dsl.rb
56
+ - lib/typelizer/dsl/hooks.rb
57
+ - lib/typelizer/dsl/hooks/alba.rb
58
+ - lib/typelizer/dsl/hooks/ams.rb
59
+ - lib/typelizer/dsl/hooks/oj_serializers.rb
60
+ - lib/typelizer/dsl/hooks/panko.rb
56
61
  - lib/typelizer/generator.rb
57
62
  - lib/typelizer/import_sorter.rb
58
63
  - lib/typelizer/interface.rb
@@ -60,6 +65,7 @@ files:
60
65
  - lib/typelizer/model_plugins/active_record.rb
61
66
  - lib/typelizer/model_plugins/auto.rb
62
67
  - lib/typelizer/model_plugins/poro.rb
68
+ - lib/typelizer/openapi.rb
63
69
  - lib/typelizer/property.rb
64
70
  - lib/typelizer/property_sorter.rb
65
71
  - lib/typelizer/railtie.rb
@@ -81,6 +87,7 @@ files:
81
87
  - lib/typelizer/templates/inline_type.ts.erb
82
88
  - lib/typelizer/templates/interface.ts.erb
83
89
  - lib/typelizer/type_parser.rb
90
+ - lib/typelizer/union_type_sorter.rb
84
91
  - lib/typelizer/version.rb
85
92
  - lib/typelizer/writer.rb
86
93
  homepage: https://github.com/skryukov/typelizer
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Typelizer
4
- # Builds a minimal plugin used during scan time
5
- class ScanContext
6
- class InvalidOperationError < StandardError; end
7
-
8
- # Interface creation is not available during DSL scanning phase (TracePoint)
9
- def self.interface_for(serializer_class)
10
- class_name = serializer_class&.name || "unknown class"
11
- raise InvalidOperationError,
12
- "Interface creation is not allowed during DSL scan (#{class_name})"
13
- end
14
-
15
- # just in case, if we call ScanContext like an object
16
- def interface_for(serializer_class)
17
- self.class.interface_for(serializer_class)
18
- end
19
- end
20
- end