graphiti 1.2.18 → 1.2.26
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/CHANGELOG.md +1 -1
- data/Gemfile +2 -0
- data/Guardfile +1 -1
- data/graphiti.gemspec +1 -2
- data/lib/graphiti/adapters/active_record.rb +1 -1
- data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +21 -1
- data/lib/graphiti/debugger.rb +8 -4
- data/lib/graphiti/errors.rb +14 -0
- data/lib/graphiti/extensions/extra_attribute.rb +1 -1
- data/lib/graphiti/query.rb +28 -12
- data/lib/graphiti/request_validator.rb +6 -6
- data/lib/graphiti/request_validators/validator.rb +7 -1
- data/lib/graphiti/resource/dsl.rb +2 -0
- data/lib/graphiti/resource/interface.rb +12 -2
- data/lib/graphiti/resource_proxy.rb +3 -1
- data/lib/graphiti/runner.rb +4 -4
- data/lib/graphiti/sideload.rb +4 -0
- data/lib/graphiti/sideload/has_many.rb +19 -1
- data/lib/graphiti/sideload/many_to_many.rb +6 -2
- data/lib/graphiti/util/link.rb +1 -1
- data/lib/graphiti/version.rb +1 -1
- metadata +12 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 872977a69e5cb7a4fd2cbe93953be2dbba89868f3c41267b8a72ce22ffb5c600
|
4
|
+
data.tar.gz: 2d189dcaa525e2d5a1b2ffd752a53cc28e0e381cb2411d8530e750175f9de92c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e3b922df304f43f3404db5e0213dce76bd073d6d226a3c62620fc5ff0198c2a13a6c7ed3b48b92421cfb6396acb31c11e84edb099bdab915cc9b8917baa845b
|
7
|
+
data.tar.gz: 80a5f5f23638c598c64012032a7ab4aea3fc5ce515f6b72f9bdf93f19c1c50ee3fd9fd373a6ccec34e4f84f6cf3217257d10d93b4a870aa06e91be67e610c8b0
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
3
|
Features:
|
4
|
-
|
4
|
+
- [242](https://github.com/graphiti-api/graphiti/pull/242) Bump `jsonapi-renderer` to `~0.2.2` now that (https://github.com/jsonapi-rb/jsonapi-renderer/pull/36) is fixed.
|
5
5
|
- [158](https://github.com/graphiti-api/graphiti/pull/158) Filters options `allow_nil: true`
|
6
6
|
Option can be set at the resource level `Resource.filters_accept_nil_by_default = true`.
|
7
7
|
By default this is set to false. (@zeisler)
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
guard :rspec, cmd: "bundle exec rspec --color --format documentation" do
|
2
2
|
require "guard/rspec/dsl"
|
3
3
|
dsl = Guard::RSpec::Dsl.new(self)
|
4
|
-
watch(%r{^spec/(.*)
|
4
|
+
watch(%r{^spec/(.*)/?(.*)_spec\.rb$})
|
5
5
|
|
6
6
|
# Feel free to open issues for suggestions and improvements
|
7
7
|
|
data/graphiti.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.required_ruby_version = "~> 2.3"
|
20
20
|
|
21
21
|
spec.add_dependency "jsonapi-serializable", "~> 0.3.0"
|
22
|
-
spec.add_dependency "jsonapi-renderer", "0.2.
|
22
|
+
spec.add_dependency "jsonapi-renderer", "~> 0.2", ">= 0.2.2"
|
23
23
|
spec.add_dependency "dry-types", ">= 0.15.0", "< 2.0"
|
24
24
|
spec.add_dependency "graphiti_errors", "~> 1.1.0"
|
25
25
|
spec.add_dependency "concurrent-ruby", "~> 1.0"
|
@@ -31,5 +31,4 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
32
|
spec.add_development_dependency "activemodel", ">= 4.1"
|
33
33
|
spec.add_development_dependency "graphiti_spec_helpers", "1.0.beta.4"
|
34
|
-
spec.add_development_dependency "standard"
|
35
34
|
end
|
@@ -159,7 +159,7 @@ module Graphiti
|
|
159
159
|
|
160
160
|
# Ensure fractional seconds don't matter
|
161
161
|
def filter_datetime_eq(scope, attribute, value, is_not: false)
|
162
|
-
ranges = value.map { |v| (v..v + 1.second - 0.00000001) }
|
162
|
+
ranges = value.map { |v| (v..v + 1.second - 0.00000001) unless v.nil? }
|
163
163
|
clause = {attribute => ranges}
|
164
164
|
is_not ? scope.where.not(clause) : scope.where(clause)
|
165
165
|
end
|
@@ -8,6 +8,18 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
8
8
|
foreign_key.keys.first
|
9
9
|
end
|
10
10
|
|
11
|
+
def inverse_filter
|
12
|
+
return @inverse_filter if @inverse_filter
|
13
|
+
|
14
|
+
inferred_name = infer_inverse_association
|
15
|
+
|
16
|
+
if inferred_name
|
17
|
+
"#{inferred_name.to_s.singularize}_id"
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
11
23
|
def belongs_to_many_filter(scope, value)
|
12
24
|
if polymorphic?
|
13
25
|
clauses = value.group_by { |v| v["type"] }.map { |group|
|
@@ -36,7 +48,8 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
36
48
|
|
37
49
|
def filter_for(scope, value, type = nil)
|
38
50
|
scope
|
39
|
-
.
|
51
|
+
.preload(through_relationship_name)
|
52
|
+
.joins(through_relationship_name)
|
40
53
|
.where(belongs_to_many_clause(value, type))
|
41
54
|
end
|
42
55
|
|
@@ -75,4 +88,11 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
75
88
|
value = through_reflection.foreign_key.to_sym
|
76
89
|
{key => value}
|
77
90
|
end
|
91
|
+
|
92
|
+
def infer_inverse_association
|
93
|
+
through_class = through_reflection.klass
|
94
|
+
|
95
|
+
foreign_reflection = through_class.reflections[name.to_s.singularize]
|
96
|
+
foreign_reflection && foreign_reflection.options[:inverse_of]
|
97
|
+
end
|
78
98
|
end
|
data/lib/graphiti/debugger.rb
CHANGED
@@ -10,6 +10,8 @@ module Graphiti
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
def on_data(name, start, stop, id, payload)
|
13
|
+
return [] unless enabled
|
14
|
+
|
13
15
|
took = ((stop - start) * 1000.0).round(2)
|
14
16
|
params = scrub_params(payload[:params])
|
15
17
|
|
@@ -24,7 +26,7 @@ module Graphiti
|
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
def on_data_exception(payload, params)
|
29
|
+
private def on_data_exception(payload, params)
|
28
30
|
unless payload[:exception_object].instance_variable_get(:@__graphiti_debug)
|
29
31
|
add_chunk do |logs, json|
|
30
32
|
logs << ["\n=== Graphiti Debug ERROR", :red, true]
|
@@ -49,11 +51,11 @@ module Graphiti
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
def results(raw_results)
|
54
|
+
private def results(raw_results)
|
53
55
|
raw_results.map { |r| "[#{r.class.name}, #{r.id.inspect}]" }.join(", ")
|
54
56
|
end
|
55
57
|
|
56
|
-
def on_sideload_data(payload, params, took)
|
58
|
+
private def on_sideload_data(payload, params, took)
|
57
59
|
sideload = payload[:sideload]
|
58
60
|
results = results(payload[:results])
|
59
61
|
add_chunk(payload[:resource], payload[:parent]) do |logs, json|
|
@@ -72,7 +74,7 @@ module Graphiti
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
|
-
def on_primary_data(payload, params, took)
|
77
|
+
private def on_primary_data(payload, params, took)
|
76
78
|
results = results(payload[:results])
|
77
79
|
add_chunk(payload[:resource], payload[:parent]) do |logs, json|
|
78
80
|
logs << [""]
|
@@ -90,6 +92,8 @@ module Graphiti
|
|
90
92
|
end
|
91
93
|
|
92
94
|
def on_render(name, start, stop, id, payload)
|
95
|
+
return [] unless enabled
|
96
|
+
|
93
97
|
add_chunk do |logs|
|
94
98
|
took = ((stop - start) * 1000.0).round(2)
|
95
99
|
logs << [""]
|
data/lib/graphiti/errors.rb
CHANGED
@@ -366,6 +366,20 @@ module Graphiti
|
|
366
366
|
end
|
367
367
|
end
|
368
368
|
|
369
|
+
class UndefinedIDLookup < Base
|
370
|
+
def initialize(resource_class)
|
371
|
+
@resource_class = resource_class
|
372
|
+
end
|
373
|
+
|
374
|
+
def message
|
375
|
+
<<~MSG
|
376
|
+
Tried to resolve #{@resource_class} with an :id filter, but the filter was nil.
|
377
|
+
This can result in unscoping a query, which can cause incorrect values to be
|
378
|
+
returned which may or may not bypass standard access controls.
|
379
|
+
MSG
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
369
383
|
class UnknownAttribute < AttributeError
|
370
384
|
def message
|
371
385
|
"#{super}, but could not find an attribute with that name."
|
data/lib/graphiti/query.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Graphiti
|
2
2
|
class Query
|
3
|
-
attr_reader :resource, :association_name, :params
|
3
|
+
attr_reader :resource, :association_name, :params, :action
|
4
4
|
|
5
|
-
def initialize(resource, params, association_name = nil, nested_include = nil, parents = [])
|
5
|
+
def initialize(resource, params, association_name = nil, nested_include = nil, parents = [], action = nil)
|
6
6
|
@resource = resource
|
7
7
|
@association_name = association_name
|
8
8
|
@params = params
|
@@ -11,6 +11,7 @@ module Graphiti
|
|
11
11
|
@params = @params.deep_symbolize_keys
|
12
12
|
@include_param = nested_include || @params[:include]
|
13
13
|
@parents = parents
|
14
|
+
@action = parse_action(action)
|
14
15
|
end
|
15
16
|
|
16
17
|
def association?
|
@@ -44,16 +45,19 @@ module Graphiti
|
|
44
45
|
|
45
46
|
def hash
|
46
47
|
@hash ||= {}.tap do |h|
|
47
|
-
h[:filter] = filters
|
48
|
-
h[:sort] = sorts
|
49
|
-
h[:page] = pagination
|
50
|
-
|
51
|
-
|
52
|
-
h[:extra_fields] = extra_fields
|
48
|
+
h[:filter] = filters
|
49
|
+
h[:sort] = sorts
|
50
|
+
h[:page] = pagination
|
51
|
+
if association?
|
52
|
+
resource_type = @resource.class.type
|
53
|
+
h[:extra_fields] = {resource_type => extra_fields[resource_type]} if extra_fields.key?(resource_type)
|
54
|
+
else
|
55
|
+
h[:fields] = fields
|
56
|
+
h[:extra_fields] = extra_fields
|
53
57
|
end
|
54
|
-
h[:stats] = stats
|
55
|
-
h[:include] = sideload_hash
|
56
|
-
end
|
58
|
+
h[:stats] = stats
|
59
|
+
h[:include] = sideload_hash
|
60
|
+
end.reject { |_, value| value.empty? }
|
57
61
|
end
|
58
62
|
|
59
63
|
def zero_results?
|
@@ -92,7 +96,7 @@ module Graphiti
|
|
92
96
|
sl_resource = resource_for_sideload(sideload)
|
93
97
|
query_parents = parents + [self]
|
94
98
|
sub_hash = sub_hash[:include] if sub_hash.key?(:include)
|
95
|
-
hash[key] = Query.new(sl_resource, @params, key, sub_hash, query_parents)
|
99
|
+
hash[key] = Query.new(sl_resource, @params, key, sub_hash, query_parents, :all)
|
96
100
|
else
|
97
101
|
handle_missing_sideload(key)
|
98
102
|
end
|
@@ -312,5 +316,17 @@ module Graphiti
|
|
312
316
|
end
|
313
317
|
end
|
314
318
|
end
|
319
|
+
|
320
|
+
def parse_action(action)
|
321
|
+
action ||= @params.fetch(:action, Graphiti.context[:namespace]).try(:to_sym)
|
322
|
+
case action
|
323
|
+
when :index
|
324
|
+
:all
|
325
|
+
when :show
|
326
|
+
:find
|
327
|
+
else
|
328
|
+
action
|
329
|
+
end
|
330
|
+
end
|
315
331
|
end
|
316
332
|
end
|
@@ -6,18 +6,18 @@ module Graphiti
|
|
6
6
|
:deserialized_payload,
|
7
7
|
to: :@validator
|
8
8
|
|
9
|
-
def initialize(root_resource, raw_params)
|
10
|
-
@validator = ValidatorFactory.create(root_resource, raw_params)
|
9
|
+
def initialize(root_resource, raw_params, action)
|
10
|
+
@validator = ValidatorFactory.create(root_resource, raw_params, action)
|
11
11
|
end
|
12
12
|
|
13
13
|
class ValidatorFactory
|
14
|
-
def self.create(root_resource, raw_params)
|
15
|
-
case
|
16
|
-
when
|
14
|
+
def self.create(root_resource, raw_params, action)
|
15
|
+
case action
|
16
|
+
when :update then
|
17
17
|
RequestValidators::UpdateValidator
|
18
18
|
else
|
19
19
|
RequestValidators::Validator
|
20
|
-
end.new(root_resource, raw_params)
|
20
|
+
end.new(root_resource, raw_params, action)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -3,10 +3,11 @@ module Graphiti
|
|
3
3
|
class Validator
|
4
4
|
attr_reader :errors
|
5
5
|
|
6
|
-
def initialize(root_resource, raw_params)
|
6
|
+
def initialize(root_resource, raw_params, action)
|
7
7
|
@root_resource = root_resource
|
8
8
|
@raw_params = raw_params
|
9
9
|
@errors = Graphiti::Util::SimpleErrors.new(raw_params)
|
10
|
+
@action = action
|
10
11
|
end
|
11
12
|
|
12
13
|
def validate
|
@@ -68,6 +69,11 @@ module Graphiti
|
|
68
69
|
|
69
70
|
def typecast_attributes(resource, attributes, payload_path)
|
70
71
|
attributes.each_pair do |key, value|
|
72
|
+
# Only validate id if create action, otherwise it's only used for lookup
|
73
|
+
next if @action != :create &&
|
74
|
+
key == :id &&
|
75
|
+
resource.class.config[:attributes][:id][:writable] == false
|
76
|
+
|
71
77
|
begin
|
72
78
|
attributes[key] = resource.typecast(key, value, :writable)
|
73
79
|
rescue Graphiti::Errors::UnknownAttribute
|
@@ -5,6 +5,7 @@ module Graphiti
|
|
5
5
|
|
6
6
|
class_methods do
|
7
7
|
def filter(name, *args, &blk)
|
8
|
+
name = name.to_sym
|
8
9
|
opts = args.extract_options!
|
9
10
|
type_override = args[0]
|
10
11
|
|
@@ -135,6 +136,7 @@ module Graphiti
|
|
135
136
|
filterable: false
|
136
137
|
}
|
137
138
|
options = defaults.merge(options)
|
139
|
+
attribute_option(options, :readable)
|
138
140
|
config[:extra_attributes][name] = options
|
139
141
|
apply_extra_attributes_to_serializer
|
140
142
|
end
|
@@ -11,7 +11,7 @@ module Graphiti
|
|
11
11
|
|
12
12
|
# @api private
|
13
13
|
def _all(params, opts, base_scope)
|
14
|
-
runner = Runner.new(self, params, opts.delete(:query))
|
14
|
+
runner = Runner.new(self, params, opts.delete(:query), :all)
|
15
15
|
opts[:params] = params
|
16
16
|
runner.proxy(base_scope, opts)
|
17
17
|
end
|
@@ -23,11 +23,14 @@ module Graphiti
|
|
23
23
|
|
24
24
|
# @api private
|
25
25
|
def _find(params = {}, base_scope = nil)
|
26
|
+
guard_nil_id!(params[:data])
|
27
|
+
guard_nil_id!(params)
|
28
|
+
|
26
29
|
id = params[:data].try(:[], :id) || params.delete(:id)
|
27
30
|
params[:filter] ||= {}
|
28
31
|
params[:filter][:id] = id if id
|
29
32
|
|
30
|
-
runner = Runner.new(self, params)
|
33
|
+
runner = Runner.new(self, params, nil, :find)
|
31
34
|
runner.proxy base_scope,
|
32
35
|
single: true,
|
33
36
|
raise_on_missing: true,
|
@@ -52,6 +55,13 @@ module Graphiti
|
|
52
55
|
end
|
53
56
|
end
|
54
57
|
end
|
58
|
+
|
59
|
+
def guard_nil_id!(params)
|
60
|
+
return unless params
|
61
|
+
if params.key?(:id) && params[:id].nil?
|
62
|
+
raise Errors::UndefinedIDLookup.new(self)
|
63
|
+
end
|
64
|
+
end
|
55
65
|
end
|
56
66
|
end
|
57
67
|
end
|
@@ -93,7 +93,7 @@ module Graphiti
|
|
93
93
|
original = Graphiti.context[:namespace]
|
94
94
|
begin
|
95
95
|
Graphiti.context[:namespace] = action
|
96
|
-
::Graphiti::RequestValidator.new(@resource, @payload.params).validate!
|
96
|
+
::Graphiti::RequestValidator.new(@resource, @payload.params, action).validate!
|
97
97
|
validator = persist {
|
98
98
|
@resource.persist_with_relationships \
|
99
99
|
@payload.meta(action: action),
|
@@ -118,6 +118,7 @@ module Graphiti
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def destroy
|
121
|
+
data
|
121
122
|
transaction_response = @resource.transaction do
|
122
123
|
metadata = {method: :destroy}
|
123
124
|
model = @resource.destroy(@query.filters[:id], metadata)
|
@@ -135,6 +136,7 @@ module Graphiti
|
|
135
136
|
end
|
136
137
|
|
137
138
|
def update_attributes
|
139
|
+
data
|
138
140
|
save(action: :update)
|
139
141
|
end
|
140
142
|
|
data/lib/graphiti/runner.rb
CHANGED
@@ -3,13 +3,13 @@ module Graphiti
|
|
3
3
|
attr_reader :params
|
4
4
|
attr_reader :deserialized_payload
|
5
5
|
|
6
|
-
def initialize(resource_class, params, query = nil)
|
6
|
+
def initialize(resource_class, params, query = nil, action = nil)
|
7
7
|
@resource_class = resource_class
|
8
8
|
@params = params
|
9
9
|
@query = query
|
10
|
+
@action = action
|
10
11
|
|
11
|
-
validator = RequestValidator.new(jsonapi_resource, params)
|
12
|
-
|
12
|
+
validator = RequestValidator.new(jsonapi_resource, params, action)
|
13
13
|
validator.validate!
|
14
14
|
|
15
15
|
@deserialized_payload = validator.deserialized_payload
|
@@ -30,7 +30,7 @@ module Graphiti
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def query
|
33
|
-
@query ||= Query.new(jsonapi_resource, params)
|
33
|
+
@query ||= Query.new(jsonapi_resource, params, nil, nil, [], @action)
|
34
34
|
end
|
35
35
|
|
36
36
|
def query_hash
|
data/lib/graphiti/sideload.rb
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
class Graphiti::Sideload::HasMany < Graphiti::Sideload
|
2
|
+
def initialize(name, opts)
|
3
|
+
@inverse_filter = opts[:inverse_filter]
|
4
|
+
|
5
|
+
super(name, opts)
|
6
|
+
end
|
7
|
+
|
2
8
|
def type
|
3
9
|
:has_many
|
4
10
|
end
|
5
11
|
|
12
|
+
def inverse_filter
|
13
|
+
@inverse_filter || foreign_key
|
14
|
+
end
|
15
|
+
|
6
16
|
def load_params(parents, query)
|
7
17
|
query.hash.tap do |hash|
|
8
18
|
hash[:filter] ||= {}
|
@@ -11,11 +21,19 @@ class Graphiti::Sideload::HasMany < Graphiti::Sideload
|
|
11
21
|
end
|
12
22
|
|
13
23
|
def base_filter(parents)
|
14
|
-
{foreign_key =>
|
24
|
+
{foreign_key => parent_filter(parents)}
|
25
|
+
end
|
26
|
+
|
27
|
+
def link_filter(parents)
|
28
|
+
{inverse_filter => parent_filter(parents)}
|
15
29
|
end
|
16
30
|
|
17
31
|
private
|
18
32
|
|
33
|
+
def parent_filter(parents)
|
34
|
+
ids_for_parents(parents).join(",")
|
35
|
+
end
|
36
|
+
|
19
37
|
def child_map(children)
|
20
38
|
children.group_by(&foreign_key)
|
21
39
|
end
|
@@ -11,8 +11,12 @@ class Graphiti::Sideload::ManyToMany < Graphiti::Sideload::HasMany
|
|
11
11
|
foreign_key.values.first
|
12
12
|
end
|
13
13
|
|
14
|
+
def inverse_filter
|
15
|
+
@inverse_filter || true_foreign_key
|
16
|
+
end
|
17
|
+
|
14
18
|
def base_filter(parents)
|
15
|
-
{true_foreign_key =>
|
19
|
+
{true_foreign_key => parent_filter(parents)}
|
16
20
|
end
|
17
21
|
|
18
22
|
def infer_foreign_key
|
@@ -32,7 +36,7 @@ class Graphiti::Sideload::ManyToMany < Graphiti::Sideload::HasMany
|
|
32
36
|
self_ref = self
|
33
37
|
fk_type = parent_resource_class.attributes[:id][:type]
|
34
38
|
fk_type = :hash if polymorphic?
|
35
|
-
resource_class.filter
|
39
|
+
resource_class.filter inverse_filter, fk_type do
|
36
40
|
eq do |scope, value|
|
37
41
|
self_ref.belongs_to_many_filter(scope, value)
|
38
42
|
end
|
data/lib/graphiti/util/link.rb
CHANGED
@@ -60,7 +60,7 @@ module Graphiti
|
|
60
60
|
def params
|
61
61
|
@params ||= {}.tap do |params|
|
62
62
|
if @sideload.type != :belongs_to || @sideload.remote?
|
63
|
-
params[:filter] = @sideload.
|
63
|
+
params[:filter] = @sideload.link_filter([@model])
|
64
64
|
end
|
65
65
|
|
66
66
|
@sideload.params_proc&.call(params, [@model], context)
|
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.2.
|
4
|
+
version: 1.2.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jsonapi-serializable
|
@@ -28,16 +28,22 @@ dependencies:
|
|
28
28
|
name: jsonapi-renderer
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.2'
|
34
|
+
- - ">="
|
32
35
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.2.
|
36
|
+
version: 0.2.2
|
34
37
|
type: :runtime
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- -
|
41
|
+
- - "~>"
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.2
|
43
|
+
version: '0.2'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.2.2
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: dry-types
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,20 +190,6 @@ dependencies:
|
|
184
190
|
- - '='
|
185
191
|
- !ruby/object:Gem::Version
|
186
192
|
version: 1.0.beta.4
|
187
|
-
- !ruby/object:Gem::Dependency
|
188
|
-
name: standard
|
189
|
-
requirement: !ruby/object:Gem::Requirement
|
190
|
-
requirements:
|
191
|
-
- - ">="
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
version: '0'
|
194
|
-
type: :development
|
195
|
-
prerelease: false
|
196
|
-
version_requirements: !ruby/object:Gem::Requirement
|
197
|
-
requirements:
|
198
|
-
- - ">="
|
199
|
-
- !ruby/object:Gem::Version
|
200
|
-
version: '0'
|
201
193
|
description:
|
202
194
|
email:
|
203
195
|
- richmolj@gmail.com
|