agoo 2.15.0 → 2.15.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1774bcd29b45056263ad986722015b99efa5c2bc8b0607b3a08afb79cd40cd70
4
- data.tar.gz: dddc4062987102c87f1e2556ad425b33f3e0dd0a380c2a2416348ba2e07869d2
3
+ metadata.gz: 74cca7bbc7156c967212d01e349f2d9134af318c8abd59687167fa5580773e54
4
+ data.tar.gz: cf765b3109277f2caa4fbb2c25d5352990fd03a394a78de82cf81ed4b235b6f4
5
5
  SHA512:
6
- metadata.gz: 5b4dbbe0b330c4456d46354019940e962a79229486b323940e20d3b8213416fd025d6279772b35f441bbbdd8e1fa5cfebe812ecba7f5d7e3a5ad16d46b41ef25
7
- data.tar.gz: aad80f64bc75f27663c1372d02ced4a205ea5e89a5deba77619951cc09d0a083810f57520375a9fc8fe658e591f453367e1b4638f362ccfc95a2bbba3a183c7a
6
+ metadata.gz: 50ef0edcf1dcec15be40de1594ddd9dbbec5749fd9099f140ffd0ce986a50728d3ff442e63f4a2756f0bdcd082618cf37a183b31676c432cddb07f4ec916d48f
7
+ data.tar.gz: 485447bbd3013e516472a8f6531316eb5d1b4144b3197359425cc838807878756c990145c68ecaa5322a157ce93601a671449291fbece8cae05f0fe35d9c1f56
data/CHANGELOG.md CHANGED
@@ -2,12 +2,30 @@
2
2
 
3
3
  All changes to the Agoo gem are documented here. Releases follow semantic versioning.
4
4
 
5
+ ## [2.15.1] - 2022-06-18
6
+
7
+ ### Added
8
+
9
+ - Introspection can now be disabled with the `hide_schema` option to the Agoo server.
10
+
11
+ - If an exception raised from a GraphQL callback responds to `code`
12
+ that code will be used as the HTTP status.
13
+
14
+ - Added missing ability to set or add elements of a request argument
15
+ on GraphQL callback methods.
16
+
5
17
  ## [2.15.0] - 2022-05-20
6
18
 
7
19
  ### Added
8
20
 
9
21
  - Support added for PATCH.
10
22
 
23
+ - A `:hide_schema` option has been added to show the graphql/schema as
24
+ not found unless added by with the handle method of the server.
25
+
26
+ - Raising an exception that responds to `code` in a graphql resolve
27
+ function will return that code as the HTTP status code.
28
+
11
29
  ## [2.14.3] - 2022-05-05
12
30
 
13
31
  ### Fixed
data/ext/agoo/gqleval.c CHANGED
@@ -478,8 +478,14 @@ gql_eval_get_hook(agooReq req) {
478
478
  result = gql_doc_eval_func(&err, doc);
479
479
  }
480
480
  if (NULL == result) {
481
+ int code = 500;
482
+
483
+ if (err.code < 0) {
484
+ code = -err.code;
485
+ }
486
+ err.code = AGOO_ERR_EVAL;
481
487
  gql_doc_destroy(doc);
482
- err_resp(req->res, &err, 500);
488
+ err_resp(req->res, &err, code);
483
489
  return;
484
490
  }
485
491
  if (GQL_SUBSCRIPTION == doc->op->kind) {
@@ -648,7 +654,13 @@ gql_eval_post_hook(agooReq req) {
648
654
  indent = (int)strtol(s, NULL, 10);
649
655
  }
650
656
  if (NULL == (result = eval_post(&err, req)) && AGOO_ERR_OK != err.code) {
651
- err_resp(req->res, &err, 400);
657
+ int code = 400;
658
+
659
+ if (err.code < 0) {
660
+ code = -err.code;
661
+ }
662
+ err.code = AGOO_ERR_EVAL;
663
+ err_resp(req->res, &err, code);
652
664
  } else if (NULL == result) {
653
665
  value_resp(req, result, 200, indent);
654
666
  } else {
data/ext/agoo/request.c CHANGED
@@ -684,6 +684,24 @@ call(VALUE self) {
684
684
  return io;
685
685
  }
686
686
 
687
+ /* Document-method: set
688
+ *
689
+ * call-seq: set()
690
+ *
691
+ * Sets an key value pair to the environment of the request.
692
+ */
693
+ static VALUE
694
+ set(VALUE self, VALUE key, VALUE val) {
695
+ agooReq r = DATA_PTR(self);
696
+
697
+ if (NULL == r) {
698
+ rb_raise(rb_eArgError, "Request is no longer valid.");
699
+ }
700
+ rb_hash_aset((VALUE)r->env, key, val);
701
+
702
+ return Qnil;
703
+ }
704
+
687
705
  VALUE
688
706
  request_wrap(agooReq req) {
689
707
  // freed from the C side of things
@@ -723,6 +741,7 @@ request_init(VALUE mod) {
723
741
  rb_define_method(req_class, "body", body, 0);
724
742
  rb_define_method(req_class, "rack_logger", rack_logger, 0);
725
743
  rb_define_method(req_class, "call", call, 0);
744
+ rb_define_method(req_class, "set", set, 2);
726
745
 
727
746
  new_id = rb_intern("new");
728
747
 
data/ext/agoo/rgraphql.c CHANGED
@@ -58,8 +58,24 @@ make_ruby_use(agooErr err,
58
58
  volatile VALUE v;
59
59
  ID m = rb_intern(method);
60
60
 
61
- if (!rb_respond_to(root, m) ||
62
- Qnil == (v = rb_funcall(root, m, 0))) {
61
+ if (!rb_respond_to(root, m)) {
62
+ return AGOO_ERR_OK;
63
+ }
64
+ switch (rb_obj_method_arity(root, m)) {
65
+ case 0:
66
+ v = rb_funcall(root, m, 0);
67
+ break;
68
+ case 1:
69
+ v = rb_funcall(root, m, 1, Qnil);
70
+ break;
71
+ case 2:
72
+ v = rb_funcall(root, m, 2, Qnil, Qnil);
73
+ break;
74
+ default:
75
+ v = Qnil;
76
+ break;
77
+ }
78
+ if (Qnil == v) {
63
79
  return AGOO_ERR_OK;
64
80
  }
65
81
  if (NULL == (type = gql_type_get(type_name))) {
@@ -89,7 +105,13 @@ rescue_error(VALUE x, VALUE ignore) {
89
105
  const char *ms = rb_string_value_ptr(&msg);
90
106
 
91
107
  agoo_err_set(eval->err, AGOO_ERR_EVAL, "%s: %s", classname, ms);
108
+ if (rb_respond_to(info, rb_intern("code"))) {
109
+ VALUE code = rb_funcall(info, rb_intern("code"), 0);
92
110
 
111
+ if (RUBY_T_FIXNUM == rb_type(code)) {
112
+ eval->err->code = -FIX2INT(code);
113
+ }
114
+ }
93
115
  return Qfalse;
94
116
  }
95
117
 
data/ext/agoo/rserver.c CHANGED
@@ -208,12 +208,12 @@ configure(agooErr err, int port, const char *root, VALUE options) {
208
208
  }
209
209
  if (Qnil != (v = rb_hash_lookup(options, ID2SYM(rb_intern("graphql"))))) {
210
210
  const char *path;
211
- agooHook dump_hook;
212
211
  agooHook get_hook;
213
212
  agooHook post_hook;
214
213
  agooHook options_hook;
215
- char schema_path[256];
214
+ agooHook head = NULL;
216
215
  long plen;
216
+ VALUE hide_schema = Qnil;
217
217
 
218
218
  rb_check_type(v, T_STRING);
219
219
  if (AGOO_ERR_OK != gql_init(err)) {
@@ -221,21 +221,29 @@ configure(agooErr err, int port, const char *root, VALUE options) {
221
221
  }
222
222
  path = StringValuePtr(v);
223
223
  plen = (long)RSTRING_LEN(v);
224
- if ((int)sizeof(schema_path) - 8 < plen) {
225
- rb_raise(rb_eArgError, "A graphql schema path is limited to %d characters.", (int)(sizeof(schema_path) - 8));
226
- }
227
- memcpy(schema_path, path, plen);
228
- memcpy(schema_path + plen, "/schema", 8);
229
224
 
230
- dump_hook = agoo_hook_func_create(AGOO_GET, schema_path, gql_dump_hook, &agoo_server.eval_queue);
231
225
  get_hook = agoo_hook_func_create(AGOO_GET, path, gql_eval_get_hook, &agoo_server.eval_queue);
232
226
  post_hook = agoo_hook_func_create(AGOO_POST, path, gql_eval_post_hook, &agoo_server.eval_queue);
233
227
  options_hook = agoo_hook_func_create(AGOO_OPTIONS, path, gql_eval_options_hook, &agoo_server.eval_queue);
234
- dump_hook->next = get_hook;
228
+ if (Qnil != (hide_schema = rb_hash_lookup(options, ID2SYM(rb_intern("hide_schema")))) && Qtrue == hide_schema) {
229
+ head = get_hook;
230
+ } else {
231
+ char schema_path[256];
232
+ agooHook dump_hook;
233
+
234
+ if ((int)sizeof(schema_path) - 8 < plen) {
235
+ rb_raise(rb_eArgError, "A graphql schema path is limited to %d characters.", (int)(sizeof(schema_path) - 8));
236
+ }
237
+ memcpy(schema_path, path, plen);
238
+ memcpy(schema_path + plen, "/schema", 8);
239
+ dump_hook = agoo_hook_func_create(AGOO_GET, schema_path, gql_dump_hook, &agoo_server.eval_queue);
240
+ dump_hook->next = get_hook;
241
+ head = dump_hook;
242
+ }
235
243
  get_hook->next = post_hook;
236
244
  post_hook->next = options_hook;
237
245
  options_hook->next = agoo_server.hooks;
238
- agoo_server.hooks = dump_hook;
246
+ agoo_server.hooks = head;
239
247
  }
240
248
  if (Qnil != (v = rb_hash_lookup(options, ID2SYM(rb_intern("quiet"))))) {
241
249
  if (Qtrue == v) {
@@ -296,6 +304,8 @@ configure(agooErr err, int port, const char *root, VALUE options) {
296
304
  * - *:ssl_sert* [_String_] filepath to the SSL certificate file.
297
305
  *
298
306
  * - *:ssl_key* [_String_] filepath to the SSL private key file.
307
+ *
308
+ * - *:hide_schema* [_true_|_false_] if true the graphql/schema path is handled.
299
309
  */
300
310
  static VALUE
301
311
  rserver_init(int argc, VALUE *argv, VALUE self) {
data/lib/agoo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Agoo
3
3
  # Agoo version.
4
- VERSION = '2.15.0'
4
+ VERSION = '2.15.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-20 00:00:00.000000000 Z
11
+ date: 2022-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj