@@ -13,65 +13,65 @@ def initialize(key)
1313 end
1414 end
1515
16- class LogInstrumenter
17- def before_query ( unit_of_work )
18- run_hook ( unit_of_work , "begin" )
19- end
20-
21- def after_query ( unit_of_work )
22- run_hook ( unit_of_work , "end" )
23- end
24-
25- alias :before_multiplex :before_query
26- alias :after_multiplex :after_query
27-
28- private
29-
30- def run_hook ( unit_of_work , event_name )
31- unit_of_work . context [ log_key ( event_name ) ] = true
32- if unit_of_work . context [ raise_key ( event_name ) ]
33- raise InstrumenterError . new ( log_key ( event_name ) )
16+ module LogInstrumenter
17+ def self . generate ( context_key_sym )
18+ hook_method = :"#{ context_key_sym } _run_hook"
19+ mod = Module . new
20+
21+ mod . define_method ( :execute_query ) do |query :, &block |
22+ public_send ( hook_method , query , "begin" )
23+ result = nil
24+ begin
25+ result = super ( query : query , &block )
26+ ensure
27+ public_send ( hook_method , query , "end" )
28+ end
29+ result
3430 end
35- end
3631
37- def log_key ( event_name )
38- context_key ( "did_#{ event_name } " )
39- end
32+ mod . define_method ( :execute_multiplex ) do |multiplex :, &block |
33+ public_send ( hook_method , multiplex , "begin" )
34+ result = nil
35+ begin
36+ result = super ( multiplex : multiplex , &block )
37+ ensure
38+ public_send ( hook_method , multiplex , "end" )
39+ end
40+ result
41+ end
4042
41- def raise_key ( event_name )
42- context_key ( "should_raise_#{ event_name } " )
43- end
43+ mod . define_method ( hook_method ) do |unit_of_work , event_name |
44+ log_key = :"#{ context_key_sym } _did_#{ event_name } "
45+ error_key = :"#{ context_key_sym } _should_raise_#{ event_name } "
46+ unit_of_work . context [ log_key ] = true
47+ if unit_of_work . context [ error_key ]
48+ raise InstrumenterError . new ( log_key )
49+ end
50+ end
4451
45- def context_key ( suffix )
46- prefix = self . class . name . sub ( "Instrumenter" , "" ) . downcase
47- :"#{ prefix } _instrumenter_#{ suffix } "
52+ mod
4853 end
4954 end
5055
51- class FirstInstrumenter < LogInstrumenter ; end
52- class SecondInstrumenter < LogInstrumenter ; end
53-
54- class ExecutionErrorInstrumenter
55- def before_query ( query )
56+ module ExecutionErrorTrace
57+ def execute_query ( query :)
5658 if query . context [ :raise_execution_error ]
57- raise GraphQL ::ExecutionError , "Raised from instrumenter before_query "
59+ raise GraphQL ::ExecutionError , "Raised from trace execute_query "
5860 end
59- end
60-
61- def after_query ( query )
61+ super
6262 end
6363 end
6464
6565 # This is how you might add queries from a persisted query backend
6666
67- class QueryStringInstrumenter
68- def before_query ( query )
69- if query . context [ :extra_query_string ] && query . query_string . nil?
70- query . query_string = query . context [ :extra_query_string ]
67+ module QueryStringTrace
68+ def execute_multiplex ( multiplex :)
69+ multiplex . queries . each do |query |
70+ if query . context [ :extra_query_string ] && query . query_string . nil?
71+ query . query_string = query . context [ :extra_query_string ]
72+ end
7173 end
72- end
73-
74- def after_query ( query )
74+ super
7575 end
7676 end
7777
@@ -92,10 +92,10 @@ def int(value:)
9292 spec = self
9393 Class . new ( GraphQL ::Schema ) do
9494 query ( spec . query_type )
95- instrument ( :query , FirstInstrumenter . new )
96- instrument ( :query , SecondInstrumenter . new )
97- instrument ( :query , ExecutionErrorInstrumenter . new )
98- instrument ( :query , QueryStringInstrumenter . new )
95+ trace_with ( LogInstrumenter . generate ( :second_instrumenter ) )
96+ trace_with ( LogInstrumenter . generate ( :first_instrumenter ) )
97+ trace_with ( ExecutionErrorTrace )
98+ trace_with ( QueryStringTrace )
9999 end
100100 }
101101
@@ -125,10 +125,10 @@ def int(value:)
125125 assert context [ :second_instrumenter_did_end ]
126126 end
127127
128- it "rescues execution errors from before_query " do
128+ it "rescues execution errors from execute_query " do
129129 context = { raise_execution_error : true }
130130 res = schema . execute ( " { int(value: 2) } " , context : context )
131- assert_equal "Raised from instrumenter before_query " , res [ "errors" ] . first [ "message" ]
131+ assert_equal "Raised from trace execute_query " , res [ "errors" ] . first [ "message" ]
132132 refute res . key? ( "data" ) , "The query doesn't run"
133133 end
134134
@@ -142,8 +142,8 @@ def int(value:)
142142 describe "within a multiplex" do
143143 let ( :multiplex_schema ) {
144144 Class . new ( schema ) {
145- instrument ( :multiplex , FirstInstrumenter . new )
146- instrument ( :multiplex , SecondInstrumenter . new )
145+ trace_with ( LogInstrumenter . generate ( :second_instrumenter ) )
146+ trace_with ( LogInstrumenter . generate ( :first_instrumenter ) )
147147 }
148148 }
149149
0 commit comments