From c52602e04b4b28237cd469087478a3c8dad8f832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Miedes=20Garc=C3=A9s?= Date: Fri, 27 Jan 2017 13:13:19 +0100 Subject: [PATCH] Simplify the way ApiTypesCreator is used --- app/controllers/graphql_controller.rb | 2 +- lib/graph_ql/api_types_creator.rb | 25 +++++++------------- spec/lib/graph_ql/api_types_creator_spec.rb | 18 +++++++------- spec/lib/graph_ql/query_type_creator_spec.rb | 2 +- spec/lib/graphql_spec.rb | 2 +- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb index ddc143e62..ea1decdb5 100644 --- a/app/controllers/graphql_controller.rb +++ b/app/controllers/graphql_controller.rb @@ -20,7 +20,7 @@ class GraphqlController < ApplicationController private def consul_schema - api_types = GraphQL::ApiTypesCreator.new(API_TYPE_DEFINITIONS).create + api_types = GraphQL::ApiTypesCreator.create(API_TYPE_DEFINITIONS) query_type = GraphQL::QueryTypeCreator.create(api_types) GraphQL::Schema.define do diff --git a/lib/graph_ql/api_types_creator.rb b/lib/graph_ql/api_types_creator.rb index ddad7ca04..c82a5e25e 100644 --- a/lib/graph_ql/api_types_creator.rb +++ b/lib/graph_ql/api_types_creator.rb @@ -10,16 +10,10 @@ module GraphQL string: GraphQL::STRING_TYPE } - attr_accessor :created_types - - def initialize(api_type_definitions) - @api_type_definitions = api_type_definitions - @created_types = {} - end - - def create - @api_type_definitions.each do |model, info| - self.create_type(model, info[:fields]) + def self.create(api_types_definitions) + created_types = {} + api_types_definitions.each do |model, info| + create_type(model, info[:fields], created_types) end created_types end @@ -34,10 +28,9 @@ module GraphQL end end - def create_type(model, fields) - api_types_creator = self + def self.create_type(model, fields, created_types) - created_type = GraphQL::ObjectType.define do + created_types[model] = GraphQL::ObjectType.define do name model.graphql_type_name description model.graphql_type_description @@ -48,7 +41,7 @@ module GraphQL when :scalar field(field_name, SCALAR_TYPES[field_type], model.human_attribute_name(field_name)) when :singular_association - field(field_name, -> { api_types_creator.created_types[field_type] }) do + field(field_name, -> { created_types[field_type] }) do resolve -> (object, arguments, context) do association_target = object.send(field_name) if association_target.nil? @@ -60,15 +53,13 @@ module GraphQL end when :multiple_association field_type = field_type.first - connection(field_name, -> { api_types_creator.created_types[field_type].connection_type }) do + connection(field_name, -> { created_types[field_type].connection_type }) do resolve -> (object, arguments, context) { field_type.public_for_api & object.send(field_name) } end end end end - created_types[model] = created_type - return created_type # GraphQL::ObjectType end def self.parse_api_config_file(file) diff --git a/spec/lib/graph_ql/api_types_creator_spec.rb b/spec/lib/graph_ql/api_types_creator_spec.rb index 10b43ba28..637c7f1fe 100644 --- a/spec/lib/graph_ql/api_types_creator_spec.rb +++ b/spec/lib/graph_ql/api_types_creator_spec.rb @@ -1,11 +1,11 @@ require 'rails_helper' describe GraphQL::ApiTypesCreator do - let(:api_types_creator) { GraphQL::ApiTypesCreator.new( {} ) } + let(:created_types) { {} } describe "::create_type" do it "creates fields for Int attributes" do - debate_type = api_types_creator.create_type(Debate, { id: :integer }) + debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { id: :integer }, created_types) created_field = debate_type.fields['id'] expect(created_field).to be_a(GraphQL::Field) @@ -14,7 +14,7 @@ describe GraphQL::ApiTypesCreator do end it "creates fields for String attributes" do - debate_type = api_types_creator.create_type(Debate, { title: :string }) + debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { title: :string }, created_types) created_field = debate_type.fields['title'] expect(created_field).to be_a(GraphQL::Field) @@ -23,8 +23,8 @@ describe GraphQL::ApiTypesCreator do end it "creates connections for :belongs_to associations" do - user_type = api_types_creator.create_type(User, { id: :integer }) - debate_type = api_types_creator.create_type(Debate, { author: User }) + user_type = GraphQL::ApiTypesCreator.create_type(User, { id: :integer }, created_types) + debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { author: User }, created_types) connection = debate_type.fields['author'] @@ -34,8 +34,8 @@ describe GraphQL::ApiTypesCreator do end it "creates connections for :has_one associations" do - user_type = api_types_creator.create_type(User, { organization: Organization }) - organization_type = api_types_creator.create_type(Organization, { id: :integer }) + user_type = GraphQL::ApiTypesCreator.create_type(User, { organization: Organization }, created_types) + organization_type = GraphQL::ApiTypesCreator.create_type(Organization, { id: :integer }, created_types) connection = user_type.fields['organization'] @@ -45,8 +45,8 @@ describe GraphQL::ApiTypesCreator do end it "creates connections for :has_many associations" do - comment_type = api_types_creator.create_type(Comment, { id: :integer }) - debate_type = api_types_creator.create_type(Debate, { comments: [Comment] }) + comment_type = GraphQL::ApiTypesCreator.create_type(Comment, { id: :integer }, created_types) + debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { comments: [Comment] }, created_types) connection = debate_type.fields['comments'] diff --git a/spec/lib/graph_ql/query_type_creator_spec.rb b/spec/lib/graph_ql/query_type_creator_spec.rb index 7412ae0da..6d3fe7a2a 100644 --- a/spec/lib/graph_ql/query_type_creator_spec.rb +++ b/spec/lib/graph_ql/query_type_creator_spec.rb @@ -7,7 +7,7 @@ describe GraphQL::QueryTypeCreator do Proposal => { fields: { id: :integer, title: :string } } } end - let(:api_types) { GraphQL::ApiTypesCreator.new(api_type_definitions).create } + let(:api_types) { GraphQL::ApiTypesCreator.create(api_type_definitions) } describe "::create" do let(:query_type) { GraphQL::QueryTypeCreator.create(api_types) } diff --git a/spec/lib/graphql_spec.rb b/spec/lib/graphql_spec.rb index 2d976a608..06f89a356 100644 --- a/spec/lib/graphql_spec.rb +++ b/spec/lib/graphql_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -api_types = GraphQL::ApiTypesCreator.new(API_TYPE_DEFINITIONS).create +api_types = GraphQL::ApiTypesCreator.create(API_TYPE_DEFINITIONS) query_type = GraphQL::QueryTypeCreator.create(api_types) ConsulSchema = GraphQL::Schema.define do query query_type