Skip to content

Commit b0ca31a

Browse files
committed
Automatically dirty queries
1 parent 4daea66 commit b0ca31a

15 files changed

+283
-21
lines changed

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ GEM
1717
diff-lcs (1.6.2)
1818
docile (1.4.1)
1919
ffi (1.17.3-x86_64-linux-gnu)
20-
foobara (0.5.6)
20+
foobara (0.5.7)
2121
bigdecimal
2222
foobara-lru-cache (< 2.0.0)
2323
foobara-util (< 2.0.0)

lib/foobara/typescript_remote_command_generator.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,4 @@
55
require "json"
66
require "open-uri"
77

8-
src = "#{__dir__}/../../src/"
9-
10-
Foobara::Util.require_directory(src)
11-
12-
module TypescriptRemoteCommandGenerator
13-
end
8+
Foobara::Util.require_directory("#{__dir__}/../../src/")

src/generators/auth/login_command_generator.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,20 @@ module RemoteGenerator
33
module Generators
44
module Auth
55
class LoginCommandGenerator < TypescriptFromManifestBaseGenerator
6+
def import_destructure
7+
ts_instance_path.first
8+
end
9+
10+
def ts_instance_path
11+
["LoginCommand"]
12+
end
13+
14+
def ts_instance_full_path
15+
["Foobara", "Auth", "LoginCommand"]
16+
end
17+
618
def template_path
7-
"Foobara/Auth/LoginCommand.ts.erb"
19+
["Foobara", "Auth", "LoginCommand.ts.erb"]
820
end
921

1022
def dependencies

src/generators/auth/login_generator.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ def base_class_path
88
end
99

1010
def dependencies
11-
super + [LoginCommandGenerator.new(relevant_manifest)]
11+
super.reject do |generator|
12+
generator.is_a?(RemoteCommandGenerator)
13+
end + [LoginCommandGenerator.new(relevant_manifest)]
1214
end
1315
end
1416
end

src/generators/auth/logout_command_generator.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,20 @@ module RemoteGenerator
33
module Generators
44
module Auth
55
class LogoutCommandGenerator < TypescriptFromManifestBaseGenerator
6+
def import_destructure
7+
ts_instance_path.first
8+
end
9+
10+
def ts_instance_path
11+
["LogoutCommand"]
12+
end
13+
14+
def ts_instance_full_path
15+
["Foobara", "Auth", "LogoutCommand"]
16+
end
17+
618
def template_path
7-
"Foobara/Auth/LogoutCommand.ts.erb"
19+
["Foobara", "Auth", "LogoutCommand.ts.erb"]
820
end
921

1022
def dependencies

src/generators/auth/logout_generator.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ def base_class_path
88
end
99

1010
def dependencies
11-
super + [LogoutCommandGenerator.new(relevant_manifest)]
11+
super.reject do |generator|
12+
generator.is_a?(RemoteCommandGenerator)
13+
end + [LogoutCommandGenerator.new(relevant_manifest)]
1214
end
1315
end
1416
end

src/generators/auth/refresh_login_generator.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ def base_class_path
1010
end
1111

1212
def dependencies
13-
super + [LoginCommandGenerator.new(relevant_manifest)]
13+
super.reject do |generator|
14+
generator.is_a?(RemoteCommandGenerator)
15+
end + [LoginCommandGenerator.new(relevant_manifest)]
1416
end
1517
end
1618
end

src/generators/auth/requires_auth_command_generator.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,20 @@ module RemoteGenerator
55
module Generators
66
module Auth
77
class RequiresAuthCommandGenerator < TypescriptFromManifestBaseGenerator
8+
def import_destructure
9+
ts_instance_path.first
10+
end
11+
12+
def ts_instance_path
13+
["RequiresAuthCommand"]
14+
end
15+
16+
def ts_instance_full_path
17+
["Foobara", "Auth", "RequiresAuthCommand"]
18+
end
19+
820
def template_path
9-
"Foobara/Auth/RequiresAuthCommand.ts.erb"
21+
["Foobara", "Auth", "RequiresAuthCommand.ts.erb"]
1022
end
1123
end
1224
end

src/generators/auth/requires_auth_generator.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ def base_class_path
1010
end
1111

1212
def dependencies
13-
super + [RequiresAuthCommandGenerator.new(relevant_manifest)]
13+
super.reject do |generator|
14+
generator.is_a?(RemoteCommandGenerator)
15+
end + [RequiresAuthCommandGenerator.new(relevant_manifest)]
1416
end
1517
end
1618
end

src/generators/command_generator.rb

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,14 @@ def errors_in_this_namespace
3131
end
3232

3333
def dependencies
34-
errors_in_this_namespace
34+
[
35+
RemoteCommandGenerator.new(Manifest::RootManifest.new(root_manifest)),
36+
*queries_that_are_dirtied_by_this_command.keys
37+
]
38+
end
39+
40+
def will_define
41+
ts_instance_path
3542
end
3643

3744
def command_errors_index_generator
@@ -52,6 +59,121 @@ def result_json_requires_cast?
5259
result_type && type_requires_cast?(result_type)
5360
end
5461

62+
def queries_that_are_dirtied_by_this_command
63+
return {} if query?
64+
65+
return @queries_that_are_dirtied_by_this_command if defined?(@queries_that_are_dirtied_by_this_command)
66+
67+
command_result_type = result_type
68+
69+
paths_to_data = nil
70+
71+
if command_result_type
72+
command_result_type = command_result_type.to_type if command_result_type.is_a?(Manifest::TypeDeclaration)
73+
74+
if command_result_type.detached_entity?
75+
paths_to_data = { command_result_type => [:outcome, :result, command_result_type.primary_key_name] }
76+
else
77+
result_type_associations = Manifest::Model.associations(command_result_type)
78+
79+
unless result_type_associations.empty?
80+
data_path, entity_type = result_type_associations.to_a.first
81+
paths_to_data = { entity_type => [:outcome, :result, data_path, entity_type.primary_key_name] }
82+
end
83+
end
84+
end
85+
86+
if paths_to_data.nil?
87+
if inputs_type
88+
inputs_associations = Manifest::Model.associations(inputs_type)
89+
90+
unless inputs_associations.empty?
91+
data_path, entity_type = inputs_associations.to_a.first
92+
paths_to_data = { entity_type => [:inputs, *data_path] }
93+
end
94+
end
95+
end
96+
97+
dirties = {}
98+
99+
unless paths_to_data.nil?
100+
all_queries = Manifest::RootManifest.new(root_manifest).queries.map do |query|
101+
generator_for(query)
102+
end
103+
104+
paths_to_data.each_pair do |entity_type, path|
105+
all_queries.each do |query|
106+
query_inputs_type = query.inputs_type
107+
108+
if query_inputs_type
109+
query_associations = Manifest::Model.associations(query_inputs_type)
110+
query_associations.each_pair do |query_association_path, query_entity_class|
111+
query_entity_class = query_entity_class.to_type if query_entity_class.is_a?(Manifest::TypeDeclaration)
112+
113+
if query_entity_class == entity_type
114+
dirties[query] = [path, query_association_path]
115+
end
116+
end
117+
118+
next if dirties.key?(query)
119+
end
120+
121+
query_result_type = query.result_type
122+
next unless query_result_type
123+
124+
if query_result_type.is_a?(Manifest::TypeDeclaration) && query_result_type.reference?
125+
query_result_type = query_result_type.to_type
126+
end
127+
128+
if query_result_type == entity_type
129+
dirties[query] = true
130+
else
131+
entity_classes = Manifest::Model.associations(query_result_type).values.uniq
132+
133+
entity_classes.each do |query_entity_class|
134+
query_entity_class = query_entity_class.to_type if query_entity_class.is_a?(Manifest::TypeDeclaration)
135+
136+
if query_entity_class == entity_type
137+
dirties[query] = true
138+
break
139+
end
140+
end
141+
end
142+
end
143+
end
144+
end
145+
146+
@queries_that_are_dirtied_by_this_command = dirties
147+
end
148+
149+
def queries_dirtied_without_inputs
150+
return @queries_dirtied_without_inputs if defined?(@queries_dirtied_without_inputs)
151+
152+
queries_dirtied = []
153+
154+
queries_that_are_dirtied_by_this_command.each_pair do |query, value|
155+
if value == true
156+
queries_dirtied << query
157+
end
158+
end
159+
160+
@queries_dirtied_without_inputs = queries_dirtied
161+
end
162+
163+
def queries_dirtied_with_inputs
164+
return @queries_dirtied_with_inputs if defined?(@queries_dirtied_with_inputs)
165+
166+
dirtied_queries = {}
167+
168+
queries_that_are_dirtied_by_this_command.each_pair do |query, value|
169+
if value != true
170+
dirtied_queries[query] = value
171+
end
172+
end
173+
174+
@queries_dirtied_with_inputs = dirtied_queries
175+
end
176+
55177
private
56178

57179
def type_requires_cast?(type_declaration)

0 commit comments

Comments
 (0)