graphiti 1.0.alpha.17 → 1.0.alpha.18
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 +4 -4
- data/lib/generators/graphiti/generator_mixin.rb +2 -2
- data/lib/generators/graphiti/install_generator.rb +58 -0
- data/lib/generators/graphiti/resource_generator.rb +2 -2
- data/lib/generators/graphiti/resource_test_generator.rb +2 -2
- data/lib/generators/graphiti/templates/application_resource.rb.erb +2 -1
- data/lib/generators/graphiti/templates/resource_reads_spec.rb.erb +25 -9
- data/lib/generators/graphiti/templates/resource_writes_spec.rb.erb +1 -1
- data/lib/graphiti/resource/links.rb +2 -1
- data/lib/graphiti/resource_proxy.rb +9 -1
- data/lib/graphiti/scope.rb +0 -8
- data/lib/graphiti/stats/payload.rb +7 -2
- data/lib/graphiti/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a57e6a62b24c36177cc2d7191754080204f43c3
|
4
|
+
data.tar.gz: 28df77df0640febe4fa4bab38ecb9f51ee0f79f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 828cbf88441e63d92a056296751dc9a87ccb6dd4932946824f44ccef48ef0b828c498e0acbdc4751e89858188d4b13951d781d964d006ca8385daa343217c29f
|
7
|
+
data.tar.gz: 2134f9e3dcfb4209179f9c074c17b379af68b00b0182ef7a9d854644b62328ea6d5edc45925d7bf0783b833e0fd5c48166baf29c181b388f9f0442672486ecb5
|
@@ -16,8 +16,8 @@ module Graphiti
|
|
16
16
|
if ns.blank?
|
17
17
|
ns = prompt \
|
18
18
|
header: "What is your API namespace?",
|
19
|
-
description: "This will be used as a route prefix, e.g. if you want the route '/books_api/v1/authors' your namespace would be 'books_api'",
|
20
|
-
default: 'api'
|
19
|
+
description: "This will be used as a route prefix, e.g. if you want the route '/books_api/v1/authors' your namespace would be '/books_api/v1'",
|
20
|
+
default: '/api/v1'
|
21
21
|
update_config!('namespace' => ns)
|
22
22
|
end
|
23
23
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
require 'generator_mixin'
|
3
|
+
|
4
|
+
module Graphiti
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
include GeneratorMixin
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
|
10
|
+
class_option :'omit-comments',
|
11
|
+
type: :boolean,
|
12
|
+
default: false,
|
13
|
+
aliases: ['-c'],
|
14
|
+
desc: 'Generate without documentation comments'
|
15
|
+
|
16
|
+
desc "This generator boostraps graphiti"
|
17
|
+
def install
|
18
|
+
to = File.join('app/resources', "application_resource.rb")
|
19
|
+
template('application_resource.rb.erb', to)
|
20
|
+
|
21
|
+
inject_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::API\n" do
|
22
|
+
app_controller_code
|
23
|
+
end
|
24
|
+
|
25
|
+
inject_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do
|
26
|
+
app_controller_code
|
27
|
+
end
|
28
|
+
|
29
|
+
insert_into_file "config/routes.rb", :after => "Rails.application.routes.draw do\n" do
|
30
|
+
<<-STR
|
31
|
+
scope path: ApplicationResource.endpoint_namespace, defaults: { format: :jsonapi } do
|
32
|
+
# your routes go here
|
33
|
+
end
|
34
|
+
STR
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def omit_comments?
|
41
|
+
@options['omit-comments']
|
42
|
+
end
|
43
|
+
|
44
|
+
def app_controller_code
|
45
|
+
str = ""
|
46
|
+
str << " include Graphiti::Rails\n"
|
47
|
+
str << " include Graphiti::Responders\n"
|
48
|
+
str << "\n"
|
49
|
+
str << " register_exception Graphiti::Errors::RecordNotFound,\n"
|
50
|
+
str << " status: 404\n"
|
51
|
+
str << "\n"
|
52
|
+
str << " rescue_from Exception do |e|\n"
|
53
|
+
str << " handle_exception(e)\n"
|
54
|
+
str << " end\n"
|
55
|
+
str
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -59,10 +59,10 @@ module Graphiti
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def generate_route
|
62
|
-
code = "
|
62
|
+
code = " resources :#{type}"
|
63
63
|
code << ", only: [#{actions.map { |a| ":#{a}" }.join(', ')}]" if actions.length < 5
|
64
64
|
code << "\n"
|
65
|
-
inject_into_file 'config/routes.rb', after:
|
65
|
+
inject_into_file 'config/routes.rb', after: /ApplicationResource.*$\n/ do
|
66
66
|
code
|
67
67
|
end
|
68
68
|
end
|
@@ -32,12 +32,12 @@ module Graphiti
|
|
32
32
|
|
33
33
|
def generate_resource_specs
|
34
34
|
if actions?('create', 'update', 'destroy')
|
35
|
-
to = "spec/resources/#{var}/writes_spec.rb
|
35
|
+
to = "spec/resources/#{var}/writes_spec.rb"
|
36
36
|
template('resource_writes_spec.rb.erb', to)
|
37
37
|
end
|
38
38
|
|
39
39
|
if actions?('index', 'show')
|
40
|
-
to = "spec/resources/#{var}/reads_spec.rb
|
40
|
+
to = "spec/resources/#{var}/reads_spec.rb"
|
41
41
|
template('resource_reads_spec.rb.erb', to)
|
42
42
|
end
|
43
43
|
end
|
@@ -9,5 +9,6 @@ class ApplicationResource < Graphiti::Resource
|
|
9
9
|
# Subclasses can still override this default.
|
10
10
|
<%- end -%>
|
11
11
|
self.abstract_class = true
|
12
|
-
self.adapter = Graphiti::Adapters::ActiveRecord::Base
|
12
|
+
self.adapter = Graphiti::Adapters::ActiveRecord::Base
|
13
|
+
self.endpoint_namespace = '<%= api_namespace %>'
|
13
14
|
end
|
@@ -37,20 +37,36 @@ RSpec.describe <%= resource_class %>, type: :resource do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
describe 'sorting' do
|
40
|
-
|
40
|
+
describe 'by id' do
|
41
41
|
let!(:<%= var %>1) { create(:<%= var %>) }
|
42
42
|
let!(:<%= var %>2) { create(:<%= var %>) }
|
43
43
|
|
44
|
-
|
45
|
-
|
44
|
+
context 'when ascending' do
|
45
|
+
before do
|
46
|
+
params[:sort] = 'id'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'works' do
|
50
|
+
render
|
51
|
+
expect(d.map(&:id)).to eq([
|
52
|
+
<%= var %>1.id,
|
53
|
+
<%= var %>2.id
|
54
|
+
])
|
55
|
+
end
|
46
56
|
end
|
47
57
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
context 'when descending' do
|
59
|
+
before do
|
60
|
+
params[:sort] = '-id'
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'works' do
|
64
|
+
render
|
65
|
+
expect(d.map(&:id)).to eq([
|
66
|
+
<%= var %>2.id,
|
67
|
+
<%= var %>1.id
|
68
|
+
])
|
69
|
+
end
|
54
70
|
end
|
55
71
|
end
|
56
72
|
end
|
@@ -43,7 +43,7 @@ RSpec.describe <%= resource_class %>, type: :resource do
|
|
43
43
|
expect {
|
44
44
|
expect(instance.update_attributes).to eq(true)
|
45
45
|
}.to change { <%= var %>.reload.updated_at }
|
46
|
-
# and change {
|
46
|
+
# .and change { <%= var %>.foo }.to('bar') <- example
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -69,6 +69,8 @@ module Graphiti
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def allow_request?(path, params, action)
|
72
|
+
path = path.split('.')[0]
|
73
|
+
|
72
74
|
endpoints.any? do |e|
|
73
75
|
has_id = params[:id] || params[:data].try(:[], :id)
|
74
76
|
if [:update, :show, :destroy].include?(context_namespace) && has_id
|
@@ -76,7 +78,6 @@ module Graphiti
|
|
76
78
|
path.pop
|
77
79
|
path = path.join('/')
|
78
80
|
end
|
79
|
-
|
80
81
|
e[:full_path].to_s == path && e[:actions].include?(context_namespace)
|
81
82
|
end
|
82
83
|
end
|
@@ -66,7 +66,15 @@ module Graphiti
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def stats
|
69
|
-
@stats ||= @
|
69
|
+
@stats ||= if @query.hash[:stats]
|
70
|
+
payload = Stats::Payload.new @resource,
|
71
|
+
@query,
|
72
|
+
@scope.unpaginated_object,
|
73
|
+
data
|
74
|
+
payload.generate
|
75
|
+
else
|
76
|
+
{}
|
77
|
+
end
|
70
78
|
end
|
71
79
|
|
72
80
|
def save(action: :create)
|
data/lib/graphiti/scope.rb
CHANGED
@@ -14,10 +14,11 @@ module Graphiti
|
|
14
14
|
# meta: { stats: { total: { count: 100 } } }
|
15
15
|
# }
|
16
16
|
class Payload
|
17
|
-
def initialize(resource, query, scope)
|
17
|
+
def initialize(resource, query, scope, data)
|
18
18
|
@resource = resource
|
19
19
|
@query = query
|
20
20
|
@scope = scope
|
21
|
+
@data = data
|
21
22
|
end
|
22
23
|
|
23
24
|
# Generate the payload for +{ meta: { stats: { ... } } }+
|
@@ -30,7 +31,11 @@ module Graphiti
|
|
30
31
|
stats[name] = {}
|
31
32
|
|
32
33
|
each_calculation(name, calculation) do |calc, function|
|
33
|
-
|
34
|
+
args = [@scope, name]
|
35
|
+
args << @resource.context if function.arity >= 3
|
36
|
+
args << @data if function.arity == 4
|
37
|
+
|
38
|
+
stats[name][calc] = function.call(*args)
|
34
39
|
end
|
35
40
|
end
|
36
41
|
end
|
data/lib/graphiti/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.alpha.
|
4
|
+
version: 1.0.alpha.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jsonapi-serializable
|
@@ -220,6 +220,7 @@ files:
|
|
220
220
|
- graphiti.gemspec
|
221
221
|
- lib/generators/graphiti/api_test_generator.rb
|
222
222
|
- lib/generators/graphiti/generator_mixin.rb
|
223
|
+
- lib/generators/graphiti/install_generator.rb
|
223
224
|
- lib/generators/graphiti/resource_generator.rb
|
224
225
|
- lib/generators/graphiti/resource_test_generator.rb
|
225
226
|
- lib/generators/graphiti/templates/application_resource.rb.erb
|