foobara-typescript-remote-command-generator 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/src/remote_generator/services/command_inputs_generator.rb +4 -8
- data/src/remote_generator/services/command_result_generator.rb +17 -1
- data/src/remote_generator/services/domain_generator.rb +13 -1
- data/src/remote_generator/services/error_generator.rb +1 -0
- data/src/remote_generator/services/model_generator.rb +4 -48
- data/src/remote_generator/services/type_generator.rb +112 -0
- data/src/remote_generator/services/typescript_from_manifest_base_generator.rb +29 -0
- data/templates/Type/Type.ts.erb +5 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0778047e7295db9856a2f2c5907aa62e320857f514a29b68bd9eaf9a5f0c9df4'
|
4
|
+
data.tar.gz: 2a2e997115c42c315725afe2632c73359819a642d48f311d8efb14fee53798d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdc5356fa30759987e1d854a7aab83aa9ad0bb7dd3194aa2d8156cf9871990e2d2904bd6bd3a2f2fb487e7125fe81d6677180f85726b7887300451bb71a97b74
|
7
|
+
data.tar.gz: 1bb61a8659f0816ffa2ebbd42065b2e3f34471820012a5c5528081229d83be1e857155c4a5655457890b5c30d622340e4b68b9b8e26b6f71734f3315c62aa0c5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## [unreleased] - 2024-08-2x
|
2
|
+
|
3
|
+
- Add type generators to command result generator
|
4
|
+
- Add type generators to domain generator
|
5
|
+
|
6
|
+
## [0.0.2] - 2024-08-21
|
7
|
+
|
8
|
+
- Add a TypeGenerator for custom non-model types
|
9
|
+
|
1
10
|
## [0.0.1] - 2024-06-17
|
2
11
|
|
3
12
|
- Add Apache-2.0 license
|
@@ -14,18 +14,14 @@ module Foobara
|
|
14
14
|
"Command/Inputs.ts.erb"
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
@
|
19
|
-
|
20
|
-
Services::EntityGenerator.new(model)
|
21
|
-
else
|
22
|
-
Services::ModelGenerator.new(model)
|
23
|
-
end
|
17
|
+
def type_generators
|
18
|
+
@type_generators ||= inputs_types_depended_on.reject(&:builtin?).uniq.map do |type|
|
19
|
+
TypeGenerator.new(type)
|
24
20
|
end
|
25
21
|
end
|
26
22
|
|
27
23
|
def dependencies
|
28
|
-
|
24
|
+
type_generators
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
@@ -53,6 +53,22 @@ module Foobara
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
def type_generators
|
57
|
+
@type_generators ||= begin
|
58
|
+
type = result_type
|
59
|
+
type = type.to_type if result_type.is_a?(Manifest::TypeDeclaration)
|
60
|
+
|
61
|
+
if !type.builtin? && !type.model?
|
62
|
+
# TODO: Test this!!
|
63
|
+
# :nocov:
|
64
|
+
[TypeGenerator.new(type)]
|
65
|
+
# :nocov:
|
66
|
+
else
|
67
|
+
[]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
56
72
|
def atom?
|
57
73
|
serializers&.any? { |s| s == "Foobara::CommandConnectors::Serializers::AtomicSerializer" }
|
58
74
|
end
|
@@ -72,7 +88,7 @@ module Foobara
|
|
72
88
|
end
|
73
89
|
|
74
90
|
def dependencies
|
75
|
-
model_generators
|
91
|
+
model_generators + type_generators
|
76
92
|
end
|
77
93
|
end
|
78
94
|
end
|
@@ -34,6 +34,18 @@ module Foobara
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def type_generators
|
38
|
+
@type_generators ||= begin
|
39
|
+
# TODO: create a Manifest::Domain#custom_types
|
40
|
+
only_custom_types = domain_manifest.types.reject(&:model?)
|
41
|
+
only_custom_types.reject!(&:builtin?)
|
42
|
+
|
43
|
+
only_custom_types.map do |type|
|
44
|
+
TypeGenerator.new(type)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
37
49
|
def model_generators
|
38
50
|
@model_generators ||= begin
|
39
51
|
only_models = domain_manifest.models.reject(&:entity?)
|
@@ -45,7 +57,7 @@ module Foobara
|
|
45
57
|
end
|
46
58
|
|
47
59
|
def dependencies
|
48
|
-
[*command_generators, *model_generators, *entity_generators, *organization]
|
60
|
+
[*command_generators, *model_generators, *entity_generators, *type_generators, *organization]
|
49
61
|
end
|
50
62
|
|
51
63
|
def domain_name
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require_relative "typescript_from_manifest_base_generator"
|
2
|
+
require_relative "type_generator"
|
2
3
|
|
3
4
|
module Foobara
|
4
5
|
module RemoteGenerator
|
5
6
|
class Services
|
6
|
-
class ModelGenerator <
|
7
|
+
class ModelGenerator < TypeGenerator
|
7
8
|
class << self
|
8
9
|
def new(relevant_manifest)
|
9
10
|
return super unless self == ModelGenerator
|
@@ -26,57 +27,12 @@ module Foobara
|
|
26
27
|
["Model", "Model.ts.erb"]
|
27
28
|
end
|
28
29
|
|
29
|
-
def scoped_full_path(points = nil)
|
30
|
-
full_path = model_manifest.scoped_full_path
|
31
|
-
|
32
|
-
if points
|
33
|
-
start_at = full_path.size - points - 1
|
34
|
-
full_path[start_at..]
|
35
|
-
else
|
36
|
-
full_path
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
30
|
def model_name(points = nil)
|
41
|
-
|
42
|
-
scoped_full_path(points).join(".")
|
43
|
-
else
|
44
|
-
scoped_path.join(".")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Do models have associations??
|
49
|
-
def model_generators
|
50
|
-
types_depended_on.select(&:model?).map do |model|
|
51
|
-
Services::ModelGenerator.new(model)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def dependencies
|
56
|
-
model_generators
|
31
|
+
type_name(points)
|
57
32
|
end
|
58
33
|
|
59
34
|
def model_name_downcase
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
def attributes_type_ts_type
|
64
|
-
association_depth = AssociationDepth::AMBIGUOUS
|
65
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
66
|
-
end
|
67
|
-
|
68
|
-
def atom_attributes_ts_type
|
69
|
-
association_depth = AssociationDepth::ATOM
|
70
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
71
|
-
end
|
72
|
-
|
73
|
-
def aggregate_attributes_ts_type
|
74
|
-
association_depth = AssociationDepth::AGGREGATE
|
75
|
-
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
76
|
-
end
|
77
|
-
|
78
|
-
def attribute_names
|
79
|
-
attributes_type.attribute_names
|
35
|
+
type_name_downcase
|
80
36
|
end
|
81
37
|
end
|
82
38
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require_relative "typescript_from_manifest_base_generator"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module RemoteGenerator
|
5
|
+
class Services
|
6
|
+
class TypeGenerator < TypescriptFromManifestBaseGenerator
|
7
|
+
class << self
|
8
|
+
def new(relevant_manifest)
|
9
|
+
return super unless self == TypeGenerator
|
10
|
+
|
11
|
+
if relevant_manifest.entity?
|
12
|
+
EntityGenerator.new(relevant_manifest)
|
13
|
+
elsif relevant_manifest.model?
|
14
|
+
ModelGenerator.new(relevant_manifest)
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
alias type_manifest relevant_manifest
|
22
|
+
|
23
|
+
def target_path
|
24
|
+
[*domain.scoped_full_path, "types", "#{type_name}.ts"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def template_path
|
28
|
+
["Type", "Type.ts.erb"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def scoped_full_path(points = nil)
|
32
|
+
full_path = type_manifest.scoped_full_path
|
33
|
+
|
34
|
+
if points
|
35
|
+
start_at = full_path.size - points - 1
|
36
|
+
full_path[start_at..]
|
37
|
+
else
|
38
|
+
full_path
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def type_name(points = nil)
|
43
|
+
if points
|
44
|
+
scoped_full_path(points).join(".")
|
45
|
+
else
|
46
|
+
scoped_path.join(".")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def type_guts
|
51
|
+
guts = if declaration_data.key?("one_of")
|
52
|
+
declaration_data["one_of"].map do |enum_item|
|
53
|
+
value_to_ts_value(enum_item)
|
54
|
+
end.join(" | ")
|
55
|
+
else
|
56
|
+
# :nocov:
|
57
|
+
raise "Haven't implemented other types yet"
|
58
|
+
# :nocov:
|
59
|
+
end
|
60
|
+
|
61
|
+
if declaration_data["allows_nil"]
|
62
|
+
# TODO: add a custom type to the fixture manifest that includes allows_nil
|
63
|
+
# :nocov:
|
64
|
+
guts += " | undefined"
|
65
|
+
# :nocov:
|
66
|
+
end
|
67
|
+
|
68
|
+
guts
|
69
|
+
end
|
70
|
+
|
71
|
+
def model_generators
|
72
|
+
@model_generators ||= types_depended_on.select(&:model?).map do |model|
|
73
|
+
Services::ModelGenerator.new(model)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def custom_type_generators
|
78
|
+
@custom_type_generators ||= types_depended_on.reject(&:builtin?).reject(&:model?).map do |type|
|
79
|
+
Services::TypeGenerator.new(type)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def dependencies
|
84
|
+
custom_type_generators + model_generators
|
85
|
+
end
|
86
|
+
|
87
|
+
def type_name_downcase
|
88
|
+
type_name[0].downcase + type_name[1..]
|
89
|
+
end
|
90
|
+
|
91
|
+
def attributes_type_ts_type
|
92
|
+
association_depth = AssociationDepth::AMBIGUOUS
|
93
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
94
|
+
end
|
95
|
+
|
96
|
+
def atom_attributes_ts_type
|
97
|
+
association_depth = AssociationDepth::ATOM
|
98
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
99
|
+
end
|
100
|
+
|
101
|
+
def aggregate_attributes_ts_type
|
102
|
+
association_depth = AssociationDepth::AGGREGATE
|
103
|
+
foobara_type_to_ts_type(attributes_type, association_depth:, dependency_group:)
|
104
|
+
end
|
105
|
+
|
106
|
+
def attribute_names
|
107
|
+
attributes_type.attribute_names
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -66,6 +66,8 @@ module Foobara
|
|
66
66
|
Services::ProcessorClassGenerator
|
67
67
|
when Manifest::RootManifest
|
68
68
|
Services::RootManifestGenerator
|
69
|
+
when Manifest::Type
|
70
|
+
Services::TypeGenerator
|
69
71
|
else
|
70
72
|
# :nocov:
|
71
73
|
raise "Not sure how build a generator for a #{manifest}"
|
@@ -224,6 +226,10 @@ module Foobara
|
|
224
226
|
else
|
225
227
|
if type_declaration.model?
|
226
228
|
model_to_ts_model_name(type_declaration, association_depth:, initial:)
|
229
|
+
elsif can_convert_type_declaration_to_ts_type?(type_declaration)
|
230
|
+
type = type_declaration.to_type
|
231
|
+
|
232
|
+
custom_type_to_ts_type_name(type)
|
227
233
|
end
|
228
234
|
end
|
229
235
|
end
|
@@ -245,6 +251,22 @@ module Foobara
|
|
245
251
|
end
|
246
252
|
end
|
247
253
|
|
254
|
+
def can_convert_type_declaration_to_ts_type?(type_declaration)
|
255
|
+
type = type_declaration.to_type
|
256
|
+
|
257
|
+
return false if BuiltinTypes.builtin_reference?(type.reference)
|
258
|
+
|
259
|
+
allowed_keys = %w[type one_of allows_nil]
|
260
|
+
|
261
|
+
declaration_data = type.declaration_data
|
262
|
+
|
263
|
+
bad_keys = declaration_data.keys - allowed_keys
|
264
|
+
|
265
|
+
return false unless bad_keys.empty?
|
266
|
+
|
267
|
+
BuiltinTypes.builtin_reference?(declaration_data["type"])
|
268
|
+
end
|
269
|
+
|
248
270
|
def attributes_to_ts_type(attributes, dependency_group:, association_depth: AssociationDepth::AMBIGUOUS)
|
249
271
|
guts = attributes.attribute_declarations.map do |attribute_name, attribute_declaration|
|
250
272
|
" #{attribute_name}#{"?" unless attributes.required?(attribute_name)}: #{
|
@@ -280,6 +302,13 @@ module Foobara
|
|
280
302
|
dependency_group.non_colliding_type(generator)
|
281
303
|
end
|
282
304
|
|
305
|
+
def custom_type_to_ts_type_name(type)
|
306
|
+
type = type.to_type if type.is_a?(Manifest::TypeDeclaration)
|
307
|
+
generator = TypeGenerator.new(type)
|
308
|
+
|
309
|
+
dependency_group.non_colliding_type(generator)
|
310
|
+
end
|
311
|
+
|
283
312
|
def ==(other)
|
284
313
|
self.class == other.class && path == other.path && root_manifest == other.root_manifest
|
285
314
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foobara-typescript-remote-command-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foobara
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description:
|
41
|
+
description:
|
42
42
|
email:
|
43
43
|
- azimux@gmail.com
|
44
44
|
executables: []
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- src/remote_generator/services/organization_manifest_generator.rb
|
83
83
|
- src/remote_generator/services/processor_class_generator.rb
|
84
84
|
- src/remote_generator/services/root_manifest_generator.rb
|
85
|
+
- src/remote_generator/services/type_generator.rb
|
85
86
|
- src/remote_generator/services/typescript_from_manifest_base_generator.rb
|
86
87
|
- src/remote_generator/services/unloaded_entity_generator.rb
|
87
88
|
- src/remote_generator/write_typescript_to_disk.rb
|
@@ -105,6 +106,7 @@ files:
|
|
105
106
|
- templates/ModelVariants.ts.erb
|
106
107
|
- templates/Organization.ts.erb
|
107
108
|
- templates/Organization/config.ts.erb
|
109
|
+
- templates/Type/Type.ts.erb
|
108
110
|
- templates/base/DataPath.ts
|
109
111
|
- templates/base/Entity.ts
|
110
112
|
- templates/base/Error.ts
|
@@ -120,7 +122,7 @@ metadata:
|
|
120
122
|
source_code_uri: https://github.com/foobara/typescript-remote-command-generator
|
121
123
|
changelog_uri: https://github.com/foobara/typescript-remote-command-generator/CHANGELOG.md
|
122
124
|
rubygems_mfa_required: 'true'
|
123
|
-
post_install_message:
|
125
|
+
post_install_message:
|
124
126
|
rdoc_options: []
|
125
127
|
require_paths:
|
126
128
|
- lib
|
@@ -136,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
138
|
version: '0'
|
137
139
|
requirements: []
|
138
140
|
rubygems_version: 3.4.10
|
139
|
-
signing_key:
|
141
|
+
signing_key:
|
140
142
|
specification_version: 4
|
141
143
|
summary: Generates remote commands for Typescript from a foobara manifest
|
142
144
|
test_files: []
|