autographql 0.0.1 → 0.0.2

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
  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