autographql 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7e4d990782d44b899b287aeee584ab6834d25ae
4
- data.tar.gz: 3a0742a94b32db6e2565a5e0e945c2e0d9e814d2
3
+ metadata.gz: b3d3b5ac363dd52787ecb2b37909b9d4b54d3220
4
+ data.tar.gz: b99a0e6d238f0fd26d35e306ca85cbb3cbd88845
5
5
  SHA512:
6
- metadata.gz: 90a24f0e92c79a7c07362b73fe474d2720ec419b3417fbe3b5457438400374948d961f13fd18baa351fe9a52bd4e7fa6e1e47d5122cfa26a34f6338556f26f28
7
- data.tar.gz: e2a5fa39b479f4bd5596555a9ef1ee3f52274053c291ff2f2b871b1a8410cb7a40d46a1ec92cea1b41f27ea3475084866b6aa7f88dfcfa5f84ea5d9e64a65076
6
+ metadata.gz: 69216651bc19b711674130fc03bdbb245b14a6326c5d9a7f0406e401d842d9deebdfd9f1a83df53d614249a980b09f988f402493b7ed5f6a8f8464625b9f1b32
7
+ data.tar.gz: 24683a0bb35dc5e79e76feaf15cc50a9e448524984bcc86b95690376864f4cdcf2fc69c88230e470b6d0430cf8b83d5d98cc9af867d787ce523f5fba4293edeb
data/lib/autographql.rb CHANGED
@@ -1,5 +1,12 @@
1
- require "autographql/engine"
1
+ require 'active_record'
2
2
 
3
- module Autographql
4
- # Your code goes here...
3
+ require_relative 'autographql/autographql'
4
+
5
+
6
+ module AutoGraphQL
7
+ VERSION = '0.0.2'
5
8
  end
9
+
10
+
11
+ # make api available to all Active Record models
12
+ ActiveRecord::Base.extend AutoGraphQL::ObjectType
@@ -0,0 +1,49 @@
1
+ require 'set'
2
+
3
+ require_relative 'object_type'
4
+
5
+
6
+ module AutoGraphQL
7
+ extend self
8
+
9
+ @@models = Set.new
10
+
11
+
12
+ # dynamically generate ::QueryType and ::ObjectTypes
13
+ def const_missing const
14
+ super unless [ :QueryType, :ObjectTypes ].include? const
15
+
16
+ if :ObjectTypes == const
17
+ return @@models.map(&:graphql)
18
+ end
19
+
20
+ Class.new GraphQL::Schema::Object do
21
+ def self.name
22
+ 'AutoGraphQL::QueryType'
23
+ end
24
+
25
+ @@models.each do |model|
26
+ type = model.graphql
27
+
28
+ # define field for this type
29
+ field type.name.downcase, type, null: true do
30
+ argument :id, GraphQL::Types::ID, required: true
31
+ end
32
+
33
+ # create loader
34
+ define_method(type.name.downcase) do |id:|
35
+ model.find id
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ ## private
43
+
44
+ def register model
45
+ @@models << model
46
+ end
47
+ private_class_method :register
48
+
49
+ end
@@ -0,0 +1,70 @@
1
+ require 'graphql'
2
+ require 'set'
3
+
4
+
5
+ module AutoGraphQL
6
+ module ObjectType
7
+ protected
8
+
9
+ def graphql name: self.name, description: '', fields: [], exclude: []
10
+ columns = Hash[columns_hash.map {|k,v| [k.to_sym, v] }]
11
+ belongs_to = reflect_on_all_associations(:belongs_to)
12
+ # has_many = reflect_on_all_associations(:has_many)
13
+
14
+ # figure out which active record fields to expose
15
+ fields = Set.new(
16
+ (fields.empty? ? columns.keys : fields).map(&:to_sym)
17
+ )
18
+
19
+ # remove blacklisted fields
20
+ fields -= exclude.map(&:to_sym)
21
+
22
+ # remove relationships for now
23
+ fields -= belongs_to.map(&:association_foreign_key).map(&:to_sym)
24
+ # exclude += belongs_to.map(&:association_primary_key).map(&:to_sym)
25
+
26
+
27
+ gql_obj = GraphQL::ObjectType.define do
28
+ name name
29
+ description description
30
+
31
+ fields.each do |f|
32
+ type = AutoGraphQL::ObjectType.send :convert_type, columns[f].type
33
+ field f, type
34
+ end
35
+ end
36
+
37
+ # redefine method to return result
38
+ define_singleton_method(:graphql) do
39
+ gql_obj
40
+ end
41
+
42
+ # make publically available
43
+ singleton_class.send :public, :graphql
44
+
45
+ # register new GraphQL::ObjectType
46
+ AutoGraphQL.send :register, self
47
+ end
48
+
49
+
50
+ ## private
51
+
52
+ def self.convert_type type
53
+ # convert Active Record type to GraphQL type
54
+ case type
55
+ when :boolean
56
+ GraphQL::BOOLEAN_TYPE
57
+ when :integer
58
+ GraphQL::INT_TYPE
59
+ when :float
60
+ GraphQL::FLOAT_TYPE
61
+ when :string
62
+ GraphQL::STRING_TYPE
63
+ else
64
+ raise TypeError.new "unsupported type: #{type}"
65
+ end
66
+ end
67
+ private_class_method :convert_type
68
+
69
+ end
70
+ end
data/test/test_auto.rb ADDED
@@ -0,0 +1,50 @@
1
+ require 'minitest/autorun'
2
+ require 'active_record'
3
+
4
+ require_relative '../lib/autographql'
5
+ require_relative 'support/db/seed'
6
+
7
+
8
+ class AutoGQLTest < Minitest::Test
9
+
10
+ def test_type_registration
11
+ assert AutoGraphQL::ObjectTypes.include? Person.graphql
12
+ assert AutoGraphQL::ObjectTypes.include? Pet.graphql
13
+ end
14
+
15
+
16
+ def test_basic
17
+ # generate schema
18
+ schema = Class.new GraphQL::Schema do
19
+ query AutoGraphQL::QueryType
20
+ end
21
+
22
+ query = "
23
+ {
24
+ person(id: 1) { name }
25
+ }"
26
+ res = schema.execute(query).values.first
27
+
28
+ assert_equal(
29
+ {
30
+ 'name' => Person.find(1).name,
31
+ },
32
+ res['person']
33
+ )
34
+
35
+
36
+ query = "
37
+ {
38
+ pet(id: 1) { name }
39
+ }"
40
+ res = schema.execute(query).values.first
41
+
42
+ assert_equal(
43
+ {
44
+ 'name' => Pet.find(1).name,
45
+ },
46
+ res['pet']
47
+ )
48
+ end
49
+
50
+ end
@@ -0,0 +1,76 @@
1
+ require 'minitest/autorun'
2
+ require 'graphql'
3
+
4
+ require_relative '../lib/autographql'
5
+ require_relative 'support/db/seed'
6
+
7
+
8
+ ### Setup ###
9
+
10
+ # PetType not defined yet, so must use .define style
11
+ PersonType = GraphQL::ObjectType.define do
12
+ name 'Person'
13
+
14
+ field :id, types.ID
15
+ field :name, types.String
16
+ field :pets, types[PetType]
17
+ end
18
+
19
+
20
+ class PetType < GraphQL::Schema::Object
21
+ field :id, ID, null: false
22
+ field :name, String, null: false
23
+ field :person, PersonType, null: true
24
+ end
25
+
26
+
27
+ class QueryType < GraphQL::Schema::Object
28
+ # describe the field signature:
29
+ field :person, PersonType, null: true do
30
+ argument :id, ID, required: true
31
+ end
32
+
33
+ # then provide an implementation:
34
+ def person(id:)
35
+ Person.find(id)
36
+ end
37
+ end
38
+
39
+
40
+ class Schema < GraphQL::Schema
41
+ query QueryType
42
+ end
43
+
44
+
45
+ ### Actual Tests ###
46
+ class ModelTest < Minitest::Test
47
+
48
+ def test_stuff
49
+ assert_equal('Daniel', Person.first.name)
50
+ assert_equal(
51
+ ['Shelby', 'Brownie'],
52
+ Person.first.pets.pluck(:name)
53
+ )
54
+
55
+ $query = "
56
+ {
57
+ person(id: 1) {
58
+ name
59
+ pets { name }
60
+ }
61
+ }"
62
+ res = Schema.execute($query).values.first
63
+
64
+ assert_equal(
65
+ {
66
+ 'name' => 'Daniel',
67
+ 'pets' => [
68
+ { 'name' => 'Shelby' },
69
+ { 'name' => 'Brownie' },
70
+ ],
71
+ },
72
+ res['person']
73
+ )
74
+ end
75
+
76
+ end
@@ -0,0 +1,21 @@
1
+ require 'minitest/autorun'
2
+
3
+ require_relative '../lib/autographql'
4
+ require_relative 'support/db/seed'
5
+
6
+
7
+ class ModelTest < Minitest::Test
8
+
9
+ def test_stuff
10
+ assert_equal(
11
+ ['Daniel', 'Bjorn'],
12
+ Person.all.pluck(:name)
13
+ )
14
+
15
+ assert_equal(
16
+ ['Shelby', 'Brownie'],
17
+ Person.find_by(name: 'Daniel').pets.pluck(:name)
18
+ )
19
+ end
20
+
21
+ end
metadata CHANGED
@@ -1,29 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autographql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - Daniel O'Brien
7
+ - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-15 00:00:00.000000000 Z
11
+ date: 2018-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: graphql
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 5.0.1
33
+ version: '0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - "~>"
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
25
67
  - !ruby/object:Gem::Version
26
- version: 5.0.1
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
27
83
  - !ruby/object:Gem::Dependency
28
84
  name: sqlite3
29
85
  requirement: !ruby/object:Gem::Requirement
@@ -38,31 +94,19 @@ dependencies:
38
94
  - - ">="
39
95
  - !ruby/object:Gem::Version
40
96
  version: '0'
41
- description: Automagic GraphQL Schema Generation for Rails and ActiveRecord.
42
- email:
43
- - dan@dobs.org
97
+ description: Automagically generate GraphQL types and queries
98
+ email:
44
99
  executables: []
45
100
  extensions: []
46
101
  extra_rdoc_files: []
47
102
  files:
48
- - MIT-LICENSE
49
- - README.md
50
- - Rakefile
51
- - app/assets/config/autographql_manifest.js
52
- - app/assets/javascripts/autographql/application.js
53
- - app/assets/stylesheets/autographql/application.css
54
- - app/controllers/autographql/application_controller.rb
55
- - app/helpers/autographql/application_helper.rb
56
- - app/jobs/autographql/application_job.rb
57
- - app/mailers/autographql/application_mailer.rb
58
- - app/models/autographql/application_record.rb
59
- - app/views/layouts/autographql/application.html.erb
60
- - config/routes.rb
61
103
  - lib/autographql.rb
62
- - lib/autographql/engine.rb
63
- - lib/autographql/version.rb
64
- - lib/tasks/autographql_tasks.rake
65
- homepage: https://github.com/dobs/autographql
104
+ - lib/autographql/autographql.rb
105
+ - lib/autographql/object_type.rb
106
+ - test/test_auto.rb
107
+ - test/test_basic_graphql.rb
108
+ - test/test_models.rb
109
+ homepage: https://github.com/dpep/rb_autographql
66
110
  licenses:
67
111
  - MIT
68
112
  metadata: {}
@@ -82,8 +126,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
126
  version: '0'
83
127
  requirements: []
84
128
  rubyforge_project:
85
- rubygems_version: 2.6.8
129
+ rubygems_version: 2.6.11
86
130
  signing_key:
87
131
  specification_version: 4
88
- summary: Automatic GraphQL Schema Generation for Rails and ActiveRecord.
89
- test_files: []
132
+ summary: AutoGraphQL
133
+ test_files:
134
+ - test/test_auto.rb
135
+ - test/test_basic_graphql.rb
136
+ - test/test_models.rb
data/MIT-LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright 2017 Daniel O'Brien
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,64 +0,0 @@
1
- # AutoGraphQL
2
-
3
- Automatic GraphQL Schema Generation for Rails and ActiveRecord.
4
-
5
- This project is currently a very early WIP. See *Roadmap* below for requirements leading up to a usable state.
6
-
7
- ## Usage
8
- **WIP; TBD**
9
-
10
- ## Installation
11
- **WIP; TBD**
12
-
13
- Add this line to your application's Gemfile:
14
-
15
- ```ruby
16
- gem 'autographql'
17
- ```
18
-
19
- And then execute:
20
- ```bash
21
- $ bundle
22
- ```
23
-
24
- Or install it yourself as:
25
- ```bash
26
- $ gem install autographql
27
- ```
28
-
29
- ## Roadmap
30
-
31
- * v0.1.0 - Initial Release.
32
- * Discovery
33
- * [ ] Initializer
34
- * [ ] Automatic model discovery.
35
- * [ ] Default controller.
36
- * [ ] Custom endpoint support.
37
- * [ ] Custom controller support.
38
- * Typing
39
- * [ ] Simple model-to-type generation.
40
- * [ ] Automatic attribute support.
41
- * [ ] Simple relation support.
42
- * [ ] Complex relation support.
43
- * [ ] Scope support.
44
- * [ ] Custom attribute support.
45
- * Security
46
- * [ ] Cancan(can) support.
47
- * [ ] Pundit support.
48
- * [ ] Whitelisting support.
49
- * [ ] Optional schema hiding.
50
- * Performance
51
- * [ ] Eager loading based on query analysis.
52
- * Miscellaneous
53
- * [ ] Schema nesting.
54
- * [ ] Support outside of Rails.
55
- * [ ] "Eject" support.
56
- * [ ] Documentation generation.
57
-
58
- ## Contributing
59
-
60
- Contributions currently accepted in the form of pull requests, gists or issues. This project and its contributors endeavor to follow the [Ruby on Rails Code of Conduct](http://rubyonrails.org/conduct/).
61
-
62
- ## License
63
-
64
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile DELETED
@@ -1,37 +0,0 @@
1
- begin
2
- require 'bundler/setup'
3
- rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
- end
6
-
7
- require 'rdoc/task'
8
-
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Autographql'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.md')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
16
-
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
- load 'rails/tasks/engine.rake'
19
-
20
-
21
- load 'rails/tasks/statistics.rake'
22
-
23
-
24
-
25
- require 'bundler/gem_tasks'
26
-
27
- require 'rake/testtask'
28
-
29
- Rake::TestTask.new(:test) do |t|
30
- t.libs << 'lib'
31
- t.libs << 'test'
32
- t.pattern = 'test/**/*_test.rb'
33
- t.verbose = false
34
- end
35
-
36
-
37
- task default: :test
@@ -1,2 +0,0 @@
1
- //= link_directory ../javascripts/autographql .js
2
- //= link_directory ../stylesheets/autographql .css
@@ -1,13 +0,0 @@
1
- // This is a manifest file that'll be compiled into application.js, which will include all the files
2
- // listed below.
3
- //
4
- // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
- // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
- //
7
- // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
- // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
- //
10
- // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
- // about supported directives.
12
- //
13
- //= require_tree .
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
@@ -1,5 +0,0 @@
1
- module Autographql
2
- class ApplicationController < ActionController::Base
3
- protect_from_forgery with: :exception
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- module Autographql
2
- module ApplicationHelper
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Autographql
2
- class ApplicationJob < ActiveJob::Base
3
- end
4
- end
@@ -1,6 +0,0 @@
1
- module Autographql
2
- class ApplicationMailer < ActionMailer::Base
3
- default from: 'from@example.com'
4
- layout 'mailer'
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module Autographql
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- end
5
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Autographql</title>
5
- <%= stylesheet_link_tag "autographql/application", media: "all" %>
6
- <%= javascript_include_tag "autographql/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
data/config/routes.rb DELETED
@@ -1,2 +0,0 @@
1
- Autographql::Engine.routes.draw do
2
- end
@@ -1,5 +0,0 @@
1
- module Autographql
2
- class Engine < ::Rails::Engine
3
- isolate_namespace Autographql
4
- end
5
- end
@@ -1,3 +0,0 @@
1
- module Autographql
2
- VERSION = '0.0.1'
3
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :autographql do
3
- # # Task goes here
4
- # end