graphiti 1.3.5 → 1.3.6

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
  SHA256:
3
- metadata.gz: 4add496faa756dcfd1d5980628d722b0d41bc9acfdf27d04cb55db15d7e3bba7
4
- data.tar.gz: a991debe7ba1204c30388b4b3174e7fdfaf7446e7d777f3030d18296975a096e
3
+ metadata.gz: 016b045277e289f9fe3ee4969581503d8fe7fd1dc6018b6193534b85e9fb5b6b
4
+ data.tar.gz: 7a9579101b104027f07b2c9b844e5239dc2d17e8ad231ec1c67a2b01c542e404
5
5
  SHA512:
6
- metadata.gz: d6e1253418d35ce742bc1365e1f18268548ac62f180d6c606420df18f75261d3a562495e2b0213788993bdb34102b5450664e6f5124cdf713cdb3ad40af71b1f
7
- data.tar.gz: dd65210486a8b212571184d71c28feaaeb3540e85a3964ed54248a193034ebece099bba186672488642093a727d47d021210ee56f26d6e37739cc72f6d52a414
6
+ metadata.gz: 70be8b04670e43e695ae2dee287230485cf29656446a16d2e1a38085d3d5cf110ac2e3e3e8a349e655d2d57f4bab0d98e2aa827453643572921aa17def40b6fb
7
+ data.tar.gz: bf4ff958225d4c593782980878f6b18e43c1568ebd03279361692d4af7de7cc3009bbf5e1678544c854caaa9b427c74afa7df2f2f405c28cb3e0a5fcd751c156
@@ -0,0 +1,96 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request: {}
7
+
8
+ concurrency:
9
+ group: ci-${{ github.head_ref || github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ lint:
14
+ name: Lint
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: "3.0"
21
+ bundler-cache: true
22
+ - name: Run standardrb
23
+ run: bundle exec standardrb --no-fix --format progress
24
+ test:
25
+ name: "Tests - ${{ matrix.ruby }} | ${{ matrix.gemfile }} | Appraisal: ${{ matrix.appraisal }}"
26
+ runs-on: ubuntu-latest
27
+ strategy:
28
+ fail-fast: false
29
+ matrix:
30
+ ruby:
31
+ - "2.6"
32
+ - "2.7"
33
+ - "3.0"
34
+ - "3.1"
35
+ gemfile:
36
+ - Gemfile
37
+ - gemfiles/rails_5_2.gemfile
38
+ - gemfiles/rails_6.gemfile
39
+ - gemfiles/rails_7.gemfile
40
+ - gemfiles/rails_5_2_graphiti_rails.gemfile
41
+ - gemfiles/rails_6_graphiti_rails.gemfile
42
+ - gemfiles/rails_7_graphiti_rails.gemfile
43
+ appraisal:
44
+ - true
45
+ - false
46
+ include:
47
+ - ruby: ruby-head
48
+ gemfile: Gemfile
49
+ appraisal: true
50
+ - ruby: ruby-head
51
+ gemfile: Gemfile
52
+ appraisal: false
53
+ exclude:
54
+ # Skip some extra variants
55
+ - gemfile: Gemfile
56
+ appraisal: true
57
+ - gemfile: gemfiles/rails_5_2.gemfile
58
+ appraisal: false
59
+ - gemfile: gemfiles/rails_6.gemfile
60
+ appraisal: false
61
+ - gemfile: gemfiles/rails_7.gemfile
62
+ appraisal: false
63
+ - gemfile: gemfiles/rails_5_2_graphiti_rails.gemfile
64
+ appraisal: false
65
+ - gemfile: gemfiles/rails_6_graphiti_rails.gemfile
66
+ appraisal: false
67
+ - gemfile: gemfiles/rails_7_graphiti_rails.gemfile
68
+ appraisal: false
69
+ # Rails 5 can't run on Ruby 3
70
+ - gemfile: gemfiles/rails_5_2.gemfile
71
+ ruby: 3.0
72
+ - gemfile: gemfiles/rails_5_2_graphiti_rails.gemfile
73
+ ruby: 3.0
74
+ - gemfile: gemfiles/rails_5_2.gemfile
75
+ ruby: 3.1
76
+ - gemfile: gemfiles/rails_5_2_graphiti_rails.gemfile
77
+ ruby: 3.1
78
+ # Raise 7 can't run on 2.6
79
+ - gemfile: gemfiles/rails_7.gemfile
80
+ ruby: 2.6
81
+ - gemfile: gemfiles/rails_7_graphiti_rails.gemfile
82
+ ruby: 2.6
83
+ continue-on-error: ${{ matrix.ruby == 'ruby-head' }}
84
+ env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
85
+ BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}
86
+ steps:
87
+ - name: Set up Appraisal
88
+ if: matrix.appraisal
89
+ run: echo "APPRAISAL_INITIALIZED=true" >> $GITHUB_ENV
90
+ - uses: actions/checkout@v2
91
+ - uses: ruby/setup-ruby@v1
92
+ with:
93
+ ruby-version: ${{ matrix.ruby }}
94
+ bundler-cache: true
95
+ - name: Run tests
96
+ run: bundle exec rspec
data/.standard.yml CHANGED
@@ -8,7 +8,7 @@ ignore:
8
8
  # There are some false hits when doing repeated
9
9
  # Class.new blocks in different test cases
10
10
  - Lint/DuplicateMethods
11
- # This was causing many tests to be harder to read.
12
- # Ongoing discussion with StandardRB team in
13
- # https://github.com/testdouble/standard/issues/94
14
- - Standard/SemanticBlocks
11
+ # We define a lot of test-specific classes within our test blocks
12
+ # There's probably a better way to do this, but it's not worth the
13
+ # effort right now, so let's just disable for specs
14
+ - Lint/ConstantDefinitionInBlock
data/Appraisals CHANGED
@@ -1,70 +1,44 @@
1
- appraise "rails-4" do
2
- gem "rails", "~> 4.2"
3
- gem "rspec-rails"
4
- gem "sqlite3", "~> 1.3.6"
5
- gem "database_cleaner"
6
- end
7
-
8
- appraise "rails-5_0" do
9
- gem "rails", "~> 5.0"
10
- gem "rspec-rails"
11
- gem "sqlite3", "~> 1.3.6"
12
- gem "database_cleaner"
13
- end
14
-
15
- appraise "rails-5_1" do
16
- gem "rails", "~> 5.1"
17
- gem "rspec-rails"
18
- gem "sqlite3", "~> 1.3.6"
19
- gem "database_cleaner"
20
- end
21
-
22
1
  appraise "rails-5_2" do
23
- gem "rails", "~> 5.2"
2
+ gem "rails", "~> 5.2.0"
24
3
  gem "rspec-rails"
25
- gem "sqlite3", "~> 1.3.6"
4
+ gem "sqlite3", "~> 1.4.0"
26
5
  gem "database_cleaner"
27
6
  end
28
7
 
29
- appraise "rails-5_0-graphiti-rails" do
30
- gem "rails", "~> 5.0"
8
+ appraise "rails-5_2-graphiti-rails" do
9
+ gem "rails", "~> 5.2.0"
31
10
  gem "rspec-rails"
32
- gem "sqlite3", "~> 1.3.6"
11
+ gem "sqlite3", "~> 1.4.0"
33
12
  gem "database_cleaner"
34
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
35
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
13
+ gem "graphiti-rails", "~> 0.4.0"
36
14
  end
37
15
 
38
- appraise "rails-5_1-graphiti-rails" do
39
- gem "rails", "~> 5.1"
16
+ appraise "rails-6" do
17
+ gem "rails", "~> 6.0"
40
18
  gem "rspec-rails"
41
- gem "sqlite3", "~> 1.3.6"
19
+ gem "sqlite3", "~> 1.4.0"
42
20
  gem "database_cleaner"
43
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
44
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
45
21
  end
46
22
 
47
- appraise "rails-5_2-graphiti-rails" do
48
- gem "rails", "~> 5.2"
23
+ appraise "rails-6-graphiti-rails" do
24
+ gem "rails", "~> 6.0"
49
25
  gem "rspec-rails"
50
- gem "sqlite3", "~> 1.3.6"
26
+ gem "sqlite3", "~> 1.4.0"
51
27
  gem "database_cleaner"
52
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
53
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
28
+ gem "graphiti-rails", "~> 0.4.0"
54
29
  end
55
30
 
56
- appraise "rails-6" do
57
- gem "rails", "~> 6.0"
31
+ appraise "rails-7" do
32
+ gem "rails", "~> 7.0"
58
33
  gem "rspec-rails"
59
34
  gem "sqlite3", "~> 1.4.0"
60
35
  gem "database_cleaner"
61
36
  end
62
37
 
63
- appraise "rails-6-graphiti-rails" do
64
- gem "rails", "~> 6.0"
38
+ appraise "rails-7-graphiti-rails" do
39
+ gem "rails", "~> 7.0"
65
40
  gem "rspec-rails"
66
41
  gem "sqlite3", "~> 1.4.0"
67
42
  gem "database_cleaner"
68
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
69
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
43
+ gem "graphiti-rails", "~> 0.4.0"
70
44
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.2"
5
+ gem "rails", "~> 5.2.0"
6
6
  gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
7
+ gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
9
9
 
10
10
  group :test do
@@ -2,12 +2,11 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.2"
5
+ gem "rails", "~> 5.2.0"
6
6
  gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
7
+ gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
9
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
10
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
9
+ gem "graphiti-rails", "~> 0.4.0"
11
10
 
12
11
  group :test do
13
12
  gem "pry"
@@ -6,8 +6,7 @@ gem "rails", "~> 6.0"
6
6
  gem "rspec-rails"
7
7
  gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
9
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
10
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
9
+ gem "graphiti-rails", "~> 0.4.0"
11
10
 
12
11
  group :test do
13
12
  gem "pry"
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.1"
5
+ gem "rails", "~> 7.0"
6
6
  gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
7
+ gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
9
9
 
10
10
  group :test do
@@ -2,10 +2,11 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 4.2"
5
+ gem "rails", "~> 7.0"
6
6
  gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
7
+ gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
9
+ gem "graphiti-rails", "~> 0.4.0"
9
10
 
10
11
  group :test do
11
12
  gem "pry"
data/graphiti.gemspec CHANGED
@@ -16,20 +16,20 @@ Gem::Specification.new do |spec|
16
16
  spec.bindir = "exe"
17
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
18
  spec.require_paths = ["lib"]
19
- spec.required_ruby_version = [">= 2.3", "< 3.1"]
19
+ spec.required_ruby_version = ">= 2.6"
20
20
 
21
21
  spec.add_dependency "jsonapi-serializable", "~> 0.3.0"
22
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"
26
- spec.add_dependency "activesupport", ">= 4.1"
26
+ spec.add_dependency "activesupport", ">= 5.2"
27
27
 
28
28
  spec.add_development_dependency "faraday", "~> 0.15"
29
29
  spec.add_development_dependency "kaminari", "~> 0.17"
30
30
  spec.add_development_dependency "bundler"
31
- spec.add_development_dependency "rake", "~> 10.0"
32
- spec.add_development_dependency "standard", "0.4.7"
33
- spec.add_development_dependency "activemodel", ">= 4.1"
31
+ spec.add_development_dependency "rake", ">= 10.0"
32
+ spec.add_development_dependency "standard", "~> 1.4.0"
33
+ spec.add_development_dependency "activemodel", ">= 5.2"
34
34
  spec.add_development_dependency "graphiti_spec_helpers", "1.0.beta.4"
35
35
  end
@@ -1,7 +1,7 @@
1
1
  module Graphiti
2
2
  module Adapters
3
3
  class Abstract
4
- require "graphiti/adapters/persistence/associations.rb"
4
+ require "graphiti/adapters/persistence/associations"
5
5
  include Graphiti::Adapters::Persistence::Associations
6
6
 
7
7
  attr_reader :resource
@@ -19,24 +19,24 @@ module Graphiti
19
19
  def filter_eq(scope, attribute, value)
20
20
  scope.where(attribute => value)
21
21
  end
22
- alias filter_integer_eq filter_eq
23
- alias filter_float_eq filter_eq
24
- alias filter_big_decimal_eq filter_eq
25
- alias filter_date_eq filter_eq
26
- alias filter_boolean_eq filter_eq
27
- alias filter_uuid_eq filter_eq
28
- alias filter_enum_eq filter_eq
22
+ alias_method :filter_integer_eq, :filter_eq
23
+ alias_method :filter_float_eq, :filter_eq
24
+ alias_method :filter_big_decimal_eq, :filter_eq
25
+ alias_method :filter_date_eq, :filter_eq
26
+ alias_method :filter_boolean_eq, :filter_eq
27
+ alias_method :filter_uuid_eq, :filter_eq
28
+ alias_method :filter_enum_eq, :filter_eq
29
29
 
30
30
  def filter_not_eq(scope, attribute, value)
31
31
  scope.where.not(attribute => value)
32
32
  end
33
- alias filter_integer_not_eq filter_not_eq
34
- alias filter_float_not_eq filter_not_eq
35
- alias filter_big_decimal_not_eq filter_not_eq
36
- alias filter_date_not_eq filter_not_eq
37
- alias filter_boolean_not_eq filter_not_eq
38
- alias filter_uuid_not_eq filter_not_eq
39
- alias filter_enum_not_eq filter_not_eq
33
+ alias_method :filter_integer_not_eq, :filter_not_eq
34
+ alias_method :filter_float_not_eq, :filter_not_eq
35
+ alias_method :filter_big_decimal_not_eq, :filter_not_eq
36
+ alias_method :filter_date_not_eq, :filter_not_eq
37
+ alias_method :filter_boolean_not_eq, :filter_not_eq
38
+ alias_method :filter_uuid_not_eq, :filter_not_eq
39
+ alias_method :filter_enum_not_eq, :filter_not_eq
40
40
 
41
41
  def filter_string_eq(scope, attribute, value, is_not: false)
42
42
  column = column_for(scope, attribute)
@@ -122,40 +122,40 @@ module Graphiti
122
122
  column = column_for(scope, attribute)
123
123
  scope.where(column.gt_any(value))
124
124
  end
125
- alias filter_integer_gt filter_gt
126
- alias filter_float_gt filter_gt
127
- alias filter_big_decimal_gt filter_gt
128
- alias filter_datetime_gt filter_gt
129
- alias filter_date_gt filter_gt
125
+ alias_method :filter_integer_gt, :filter_gt
126
+ alias_method :filter_float_gt, :filter_gt
127
+ alias_method :filter_big_decimal_gt, :filter_gt
128
+ alias_method :filter_datetime_gt, :filter_gt
129
+ alias_method :filter_date_gt, :filter_gt
130
130
 
131
131
  def filter_gte(scope, attribute, value)
132
132
  column = column_for(scope, attribute)
133
133
  scope.where(column.gteq_any(value))
134
134
  end
135
- alias filter_integer_gte filter_gte
136
- alias filter_float_gte filter_gte
137
- alias filter_big_decimal_gte filter_gte
138
- alias filter_datetime_gte filter_gte
139
- alias filter_date_gte filter_gte
135
+ alias_method :filter_integer_gte, :filter_gte
136
+ alias_method :filter_float_gte, :filter_gte
137
+ alias_method :filter_big_decimal_gte, :filter_gte
138
+ alias_method :filter_datetime_gte, :filter_gte
139
+ alias_method :filter_date_gte, :filter_gte
140
140
 
141
141
  def filter_lt(scope, attribute, value)
142
142
  column = column_for(scope, attribute)
143
143
  scope.where(column.lt_any(value))
144
144
  end
145
- alias filter_integer_lt filter_lt
146
- alias filter_float_lt filter_lt
147
- alias filter_big_decimal_lt filter_lt
148
- alias filter_datetime_lt filter_lt
149
- alias filter_date_lt filter_lt
145
+ alias_method :filter_integer_lt, :filter_lt
146
+ alias_method :filter_float_lt, :filter_lt
147
+ alias_method :filter_big_decimal_lt, :filter_lt
148
+ alias_method :filter_datetime_lt, :filter_lt
149
+ alias_method :filter_date_lt, :filter_lt
150
150
 
151
151
  def filter_lte(scope, attribute, value)
152
152
  column = column_for(scope, attribute)
153
153
  scope.where(column.lteq_any(value))
154
154
  end
155
- alias filter_integer_lte filter_lte
156
- alias filter_float_lte filter_lte
157
- alias filter_big_decimal_lte filter_lte
158
- alias filter_date_lte filter_lte
155
+ alias_method :filter_integer_lte, :filter_lte
156
+ alias_method :filter_float_lte, :filter_lte
157
+ alias_method :filter_big_decimal_lte, :filter_lte
158
+ alias_method :filter_date_lte, :filter_lte
159
159
 
160
160
  # Ensure fractional seconds don't matter
161
161
  def filter_datetime_eq(scope, attribute, value, is_not: false)
@@ -317,7 +317,7 @@ module Graphiti
317
317
  end
318
318
 
319
319
  def sanitized_like_for(scope, attribute, value, &block)
320
- escape_char = '\\'
320
+ escape_char = "\\"
321
321
  column = column_for(scope, attribute)
322
322
  map = value.map { |v|
323
323
  v = v.downcase
@@ -5,22 +5,20 @@ module Graphiti
5
5
  def process_belongs_to(persistence, attributes)
6
6
  parents = [].tap do |processed|
7
7
  persistence.iterate(only: [:polymorphic_belongs_to, :belongs_to]) do |x|
8
- begin
9
- id = x.dig(:attributes, :id)
10
- x[:object] = x[:resource]
11
- .persist_with_relationships(x[:meta], x[:attributes], x[:relationships])
8
+ id = x.dig(:attributes, :id)
9
+ x[:object] = x[:resource]
10
+ .persist_with_relationships(x[:meta], x[:attributes], x[:relationships])
11
+ processed << x
12
+ rescue Graphiti::Errors::RecordNotFound
13
+ if Graphiti.config.raise_on_missing_sidepost
14
+ path = "relationships/#{x.dig(:meta, :jsonapi_type)}"
15
+ raise Graphiti::Errors::RecordNotFound.new(x[:sideload].name, id, path)
16
+ else
17
+ pointer = "data/relationships/#{x.dig(:meta, :jsonapi_type)}"
18
+ object = Graphiti::Errors::NullRelation.new(id.to_s, pointer)
19
+ object.errors.add(:base, :not_found, message: "could not be found")
20
+ x[:object] = object
12
21
  processed << x
13
- rescue Graphiti::Errors::RecordNotFound
14
- if Graphiti.config.raise_on_missing_sidepost
15
- path = "relationships/#{x.dig(:meta, :jsonapi_type)}"
16
- raise Graphiti::Errors::RecordNotFound.new(x[:sideload].name, id, path)
17
- else
18
- pointer = "data/relationships/#{x.dig(:meta, :jsonapi_type)}"
19
- object = Graphiti::Errors::NullRelation.new(id.to_s, pointer)
20
- object.errors.add(:base, :not_found, message: "could not be found")
21
- x[:object] = object
22
- processed << x
23
- end
24
22
  end
25
23
  end
26
24
  end
@@ -97,10 +97,8 @@ module Graphiti
97
97
  end
98
98
 
99
99
  def offset
100
- @offset ||= begin
101
- if (value = page_param[:offset])
102
- value.to_i
103
- end
100
+ @offset ||= if (value = page_param[:offset])
101
+ value.to_i
104
102
  end
105
103
  end
106
104
 
@@ -13,7 +13,7 @@ module Graphiti
13
13
  # Common interface for jsonapi-rb extensions
14
14
  def as_jsonapi(*)
15
15
  super.tap do |hash|
16
- if (temp_id = @object.instance_variable_get(:'@_jsonapi_temp_id'))
16
+ if (temp_id = @object.instance_variable_get(:@_jsonapi_temp_id))
17
17
  hash[:'temp-id'] = temp_id
18
18
  end
19
19
  end
@@ -17,7 +17,6 @@ module Graphiti
17
17
  end
18
18
  end
19
19
 
20
- # rubocop: disable Style/MethodMissingSuper
21
20
  def method_missing(name, *args, &blk)
22
21
  @procs[name] = blk
23
22
  end
@@ -69,11 +69,9 @@ module Graphiti
69
69
  end
70
70
 
71
71
  def sideload_hash
72
- @sideload_hash = begin
73
- {}.tap do |hash|
74
- sideloads.each_pair do |key, value|
75
- hash[key] = sideloads[key].hash
76
- end
72
+ @sideload_hash = {}.tap do |hash|
73
+ sideloads.each_pair do |key, value|
74
+ hash[key] = sideloads[key].hash
77
75
  end
78
76
  end
79
77
  end
@@ -89,30 +87,28 @@ module Graphiti
89
87
  end
90
88
 
91
89
  def sideloads
92
- @sideloads ||= begin
93
- {}.tap do |hash|
94
- include_hash.each_pair do |key, sub_hash|
95
- sideload = @resource.class.sideload(key)
96
-
97
- if sideload || @resource.remote?
98
- sl_resource = resource_for_sideload(sideload)
99
- query_parents = parents + [self]
100
- sub_hash = sub_hash[:include] if sub_hash.key?(:include)
101
-
102
- # NB: To handle on__<type>--<name>
103
- # A) relationship_name == :positions
104
- # B) key == on__employees.positions
105
- # This way A) ensures sideloads are resolved
106
- # And B) ensures nested filters, sorts etc still work
107
- relationship_name = sideload ? sideload.name : key
108
- hash[relationship_name] = Query.new sl_resource,
109
- @params,
110
- key,
111
- sub_hash,
112
- query_parents, :all
113
- else
114
- handle_missing_sideload(key)
115
- end
90
+ @sideloads ||= {}.tap do |hash|
91
+ include_hash.each_pair do |key, sub_hash|
92
+ sideload = @resource.class.sideload(key)
93
+
94
+ if sideload || @resource.remote?
95
+ sl_resource = resource_for_sideload(sideload)
96
+ query_parents = parents + [self]
97
+ sub_hash = sub_hash[:include] if sub_hash.key?(:include)
98
+
99
+ # NB: To handle on__<type>--<name>
100
+ # A) relationship_name == :positions
101
+ # B) key == on__employees.positions
102
+ # This way A) ensures sideloads are resolved
103
+ # And B) ensures nested filters, sorts etc still work
104
+ relationship_name = sideload ? sideload.name : key
105
+ hash[relationship_name] = Query.new sl_resource,
106
+ @params,
107
+ key,
108
+ sub_hash,
109
+ query_parents, :all
110
+ else
111
+ handle_missing_sideload(key)
116
112
  end
117
113
  end
118
114
  end
@@ -137,27 +133,25 @@ module Graphiti
137
133
  end
138
134
 
139
135
  def filters
140
- @filters ||= begin
141
- {}.tap do |hash|
142
- (@params[:filter] || {}).each_pair do |name, value|
143
- name = name.to_sym
144
-
145
- if legacy_nested?(name)
146
- value.keys.each do |key|
147
- filter_name = key.to_sym
148
- filter_value = value[key]
149
-
150
- if @resource.get_attr!(filter_name, :filterable, request: true)
151
- hash[filter_name] = filter_value
152
- end
136
+ @filters ||= {}.tap do |hash|
137
+ (@params[:filter] || {}).each_pair do |name, value|
138
+ name = name.to_sym
139
+
140
+ if legacy_nested?(name)
141
+ value.keys.each do |key|
142
+ filter_name = key.to_sym
143
+ filter_value = value[key]
144
+
145
+ if @resource.get_attr!(filter_name, :filterable, request: true)
146
+ hash[filter_name] = filter_value
153
147
  end
154
- elsif nested?(name)
155
- name = name.to_s.split(".").last.to_sym
156
- validate!(name, :filterable)
157
- hash[name] = value
158
- elsif top_level? && validate!(name, :filterable)
159
- hash[name] = value
160
148
  end
149
+ elsif nested?(name)
150
+ name = name.to_s.split(".").last.to_sym
151
+ validate!(name, :filterable)
152
+ hash[name] = value
153
+ elsif top_level? && validate!(name, :filterable)
154
+ hash[name] = value
161
155
  end
162
156
  end
163
157
  end
@@ -186,19 +180,17 @@ module Graphiti
186
180
  end
187
181
 
188
182
  def pagination
189
- @pagination ||= begin
190
- {}.tap do |hash|
191
- (@params[:page] || {}).each_pair do |name, value|
192
- if legacy_nested?(name)
193
- value.each_pair do |k, v|
194
- hash[k.to_sym] = cast_page_param(k.to_sym, v)
195
- end
196
- elsif nested?(name)
197
- param_name = name.to_s.split(".").last.to_sym
198
- hash[param_name] = cast_page_param(param_name, value)
199
- elsif top_level? && Scoping::Paginate::PARAMS.include?(name.to_sym)
200
- hash[name.to_sym] = cast_page_param(name.to_sym, value)
183
+ @pagination ||= {}.tap do |hash|
184
+ (@params[:page] || {}).each_pair do |name, value|
185
+ if legacy_nested?(name)
186
+ value.each_pair do |k, v|
187
+ hash[k.to_sym] = cast_page_param(k.to_sym, v)
201
188
  end
189
+ elsif nested?(name)
190
+ param_name = name.to_s.split(".").last.to_sym
191
+ hash[param_name] = cast_page_param(param_name, value)
192
+ elsif top_level? && Scoping::Paginate::PARAMS.include?(name.to_sym)
193
+ hash[name.to_sym] = cast_page_param(name.to_sym, value)
202
194
  end
203
195
  end
204
196
  end
@@ -221,15 +213,13 @@ module Graphiti
221
213
  end
222
214
 
223
215
  def stats
224
- @stats ||= begin
225
- {}.tap do |hash|
226
- (@params[:stats] || {}).each_pair do |k, v|
227
- if legacy_nested?(k)
228
- raise NotImplementedError.new("Association statistics are not currently supported")
229
- elsif top_level?
230
- v = v.split(",") if v.is_a?(String)
231
- hash[k.to_sym] = Array(v).flatten.map(&:to_sym)
232
- end
216
+ @stats ||= {}.tap do |hash|
217
+ (@params[:stats] || {}).each_pair do |k, v|
218
+ if legacy_nested?(k)
219
+ raise NotImplementedError.new("Association statistics are not currently supported")
220
+ elsif top_level?
221
+ v = v.split(",") if v.is_a?(String)
222
+ hash[k.to_sym] = Array(v).flatten.map(&:to_sym)
233
223
  end
234
224
  end
235
225
  end
@@ -110,10 +110,10 @@ module Graphiti
110
110
  end
111
111
 
112
112
  route = begin
113
- ::Rails.application.routes.recognize_path(path, method: method)
114
- rescue
115
- nil
116
- end
113
+ ::Rails.application.routes.recognize_path(path, method: method)
114
+ rescue
115
+ nil
116
+ end
117
117
  "#{route[:controller]}_controller".classify.safe_constantize if route
118
118
  }
119
119
  end
@@ -13,7 +13,7 @@ module Graphiti
13
13
  class ValidatorFactory
14
14
  def self.create(root_resource, raw_params, action)
15
15
  case action
16
- when :update then
16
+ when :update
17
17
  RequestValidators::UpdateValidator
18
18
  else
19
19
  RequestValidators::Validator
@@ -63,7 +63,7 @@ module Graphiti
63
63
  end
64
64
 
65
65
  def sort_all(&blk)
66
- if block_given?
66
+ if blk
67
67
  config[:_sort_all] = blk
68
68
  else
69
69
  config[:_sort_all]
@@ -189,9 +189,9 @@ module Graphiti
189
189
  def attribute_option(options, name, exclusive = false)
190
190
  if options[name] != false
191
191
  default = if (only = options[:only]) && !exclusive
192
- Array(only).include?(name) ? true : false
192
+ Array(only).include?(name)
193
193
  elsif (except = options[:except]) && !exclusive
194
- Array(except).include?(name) ? false : true
194
+ !Array(except).include?(name)
195
195
  else
196
196
  send(:"attributes_#{name}_by_default")
197
197
  end
@@ -72,7 +72,7 @@ module Graphiti
72
72
  end
73
73
 
74
74
  def resource_for_model(model)
75
- resource = children.find { |c| model.class == c.model } ||
75
+ resource = children.find { |c| model.instance_of?(c.model) } ||
76
76
  children.find { |c| model.is_a?(c.model) }
77
77
  if resource.nil?
78
78
  raise Errors::PolymorphicResourceChildNotFound.new(self, model: model)
@@ -71,7 +71,7 @@ module Graphiti
71
71
  hash[:filter][:"#{as}_type"] = model_ref.name
72
72
  end
73
73
 
74
- instance_eval(&blk) if block_given?
74
+ instance_eval(&blk) if blk
75
75
  end
76
76
  end
77
77
 
@@ -85,7 +85,7 @@ module Graphiti
85
85
  hash[:filter][:"#{as}_type"] = model_ref.name
86
86
  end
87
87
 
88
- instance_eval(&blk) if block_given?
88
+ instance_eval(&blk) if blk
89
89
  end
90
90
  end
91
91
 
@@ -73,7 +73,7 @@ module Graphiti
73
73
  records
74
74
  end
75
75
  end
76
- alias to_a data
76
+ alias_method :to_a, :data
77
77
 
78
78
  def meta
79
79
  @meta ||= data.respond_to?(:meta) ? data.meta : {}
@@ -59,12 +59,10 @@ module Graphiti
59
59
  end
60
60
 
61
61
  def sort_param
62
- @sort_param ||= begin
63
- if query_hash[:sort].blank?
64
- resource.default_sort || []
65
- else
66
- normalize(query_hash[:sort])
67
- end
62
+ @sort_param ||= if query_hash[:sort].blank?
63
+ resource.default_sort || []
64
+ else
65
+ normalize(query_hash[:sort])
68
66
  end
69
67
  end
70
68
 
@@ -7,7 +7,6 @@ class Graphiti::Sideload::PolymorphicBelongsTo < Graphiti::Sideload::BelongsTo
7
7
  @calls = []
8
8
  end
9
9
 
10
- # rubocop: disable Style/MethodMissingSuper
11
10
  def method_missing(name, *args, &blk)
12
11
  @calls << [name, args, blk]
13
12
  end
@@ -56,9 +55,9 @@ class Graphiti::Sideload::PolymorphicBelongsTo < Graphiti::Sideload::BelongsTo
56
55
  args = call[1]
57
56
  opts = args.extract_options!
58
57
  opts.merge! as: sideload.name,
59
- parent: sideload,
60
- group_name: group.name,
61
- polymorphic_child: true
58
+ parent: sideload,
59
+ group_name: group.name,
60
+ polymorphic_child: true
62
61
  unless sideload.resource.class.abstract_class?
63
62
  opts[:foreign_key] ||= sideload.foreign_key
64
63
  opts[:primary_key] ||= sideload.primary_key
@@ -46,7 +46,6 @@ module Graphiti
46
46
  #
47
47
  # ...will hit +method_missing+ and store the proc for future reference.
48
48
  # @api private
49
- # rubocop: disable Style/MethodMissingSuper
50
49
  def method_missing(meth, *args, &blk)
51
50
  @calculations[meth] = blk
52
51
  end
@@ -33,7 +33,7 @@ module Graphiti
33
33
  def size
34
34
  values.flatten.size
35
35
  end
36
- alias count size
36
+ alias_method :count, :size
37
37
 
38
38
  def values
39
39
  messages.values.reject(&:empty?)
@@ -48,7 +48,7 @@ module Graphiti
48
48
  def empty?
49
49
  size.zero?
50
50
  end
51
- alias blank? empty?
51
+ alias_method :blank?, :empty?
52
52
 
53
53
  def add(attribute, code, message: nil)
54
54
  message ||= "is #{code.to_s.humanize.downcase}"
@@ -64,7 +64,7 @@ module Graphiti
64
64
  def full_messages
65
65
  map { |attribute, message| full_message(attribute, message) }
66
66
  end
67
- alias to_a full_messages
67
+ alias_method :to_a, :full_messages
68
68
 
69
69
  def full_messages_for(attribute)
70
70
  attribute = attribute.to_sym
@@ -1,3 +1,3 @@
1
1
  module Graphiti
2
- VERSION = "1.3.5"
2
+ VERSION = "1.3.6"
3
3
  end
data/lib/graphiti.rb CHANGED
@@ -208,6 +208,7 @@ module InstanceVariableOverride
208
208
  values
209
209
  end
210
210
  end
211
+
211
212
  class Object
212
213
  prepend InstanceVariableOverride
213
214
  end
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.3.5
4
+ version: 1.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-30 00:00:00.000000000 Z
11
+ date: 2022-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-serializable
@@ -98,14 +98,14 @@ dependencies:
98
98
  requirements:
99
99
  - - ">="
100
100
  - !ruby/object:Gem::Version
101
- version: '4.1'
101
+ version: '5.2'
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
- version: '4.1'
108
+ version: '5.2'
109
109
  - !ruby/object:Gem::Dependency
110
110
  name: faraday
111
111
  requirement: !ruby/object:Gem::Requirement
@@ -152,44 +152,44 @@ dependencies:
152
152
  name: rake
153
153
  requirement: !ruby/object:Gem::Requirement
154
154
  requirements:
155
- - - "~>"
155
+ - - ">="
156
156
  - !ruby/object:Gem::Version
157
157
  version: '10.0'
158
158
  type: :development
159
159
  prerelease: false
160
160
  version_requirements: !ruby/object:Gem::Requirement
161
161
  requirements:
162
- - - "~>"
162
+ - - ">="
163
163
  - !ruby/object:Gem::Version
164
164
  version: '10.0'
165
165
  - !ruby/object:Gem::Dependency
166
166
  name: standard
167
167
  requirement: !ruby/object:Gem::Requirement
168
168
  requirements:
169
- - - '='
169
+ - - "~>"
170
170
  - !ruby/object:Gem::Version
171
- version: 0.4.7
171
+ version: 1.4.0
172
172
  type: :development
173
173
  prerelease: false
174
174
  version_requirements: !ruby/object:Gem::Requirement
175
175
  requirements:
176
- - - '='
176
+ - - "~>"
177
177
  - !ruby/object:Gem::Version
178
- version: 0.4.7
178
+ version: 1.4.0
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: activemodel
181
181
  requirement: !ruby/object:Gem::Requirement
182
182
  requirements:
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: '4.1'
185
+ version: '5.2'
186
186
  type: :development
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
189
189
  requirements:
190
190
  - - ">="
191
191
  - !ruby/object:Gem::Version
192
- version: '4.1'
192
+ version: '5.2'
193
193
  - !ruby/object:Gem::Dependency
194
194
  name: graphiti_spec_helpers
195
195
  requirement: !ruby/object:Gem::Requirement
@@ -212,10 +212,10 @@ executables:
212
212
  extensions: []
213
213
  extra_rdoc_files: []
214
214
  files:
215
+ - ".github/workflows/ci.yml"
215
216
  - ".gitignore"
216
217
  - ".rspec"
217
218
  - ".standard.yml"
218
- - ".travis.yml"
219
219
  - ".yardopts"
220
220
  - Appraisals
221
221
  - CHANGELOG.md
@@ -246,15 +246,12 @@ files:
246
246
  - deprecated_generators/graphiti/templates/update_request_spec.rb.erb
247
247
  - exe/graphiti
248
248
  - gemfiles/.bundle/config
249
- - gemfiles/rails_4.gemfile
250
- - gemfiles/rails_5_0.gemfile
251
- - gemfiles/rails_5_0_graphiti_rails.gemfile
252
- - gemfiles/rails_5_1.gemfile
253
- - gemfiles/rails_5_1_graphiti_rails.gemfile
254
249
  - gemfiles/rails_5_2.gemfile
255
250
  - gemfiles/rails_5_2_graphiti_rails.gemfile
256
251
  - gemfiles/rails_6.gemfile
257
252
  - gemfiles/rails_6_graphiti_rails.gemfile
253
+ - gemfiles/rails_7.gemfile
254
+ - gemfiles/rails_7_graphiti_rails.gemfile
258
255
  - graphiti.gemspec
259
256
  - lib/graphiti.rb
260
257
  - lib/graphiti/adapters/abstract.rb
@@ -351,10 +348,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
351
348
  requirements:
352
349
  - - ">="
353
350
  - !ruby/object:Gem::Version
354
- version: '2.3'
355
- - - "<"
356
- - !ruby/object:Gem::Version
357
- version: '3.1'
351
+ version: '2.6'
358
352
  required_rubygems_version: !ruby/object:Gem::Requirement
359
353
  requirements:
360
354
  - - ">="
data/.travis.yml DELETED
@@ -1,94 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5
5
- - 2.6
6
- - 2.7
7
- gemfile:
8
- - Gemfile
9
- - gemfiles/rails_4.gemfile
10
- - gemfiles/rails_5_0.gemfile
11
- - gemfiles/rails_5_1.gemfile
12
- - gemfiles/rails_5_2.gemfile
13
- - gemfiles/rails_6.gemfile
14
- - gemfiles/rails_5_0_graphiti_rails.gemfile
15
- - gemfiles/rails_5_1_graphiti_rails.gemfile
16
- - gemfiles/rails_5_2_graphiti_rails.gemfile
17
- - gemfiles/rails_6_graphiti_rails.gemfile
18
- env:
19
- - COMMAND="standardrb --no-fix --format progress"
20
- - COMMAND=rspec
21
- - COMMAND=rspec APPRAISAL_INITIALIZED=true
22
- jobs:
23
- allow_failures:
24
- - rvm: ruby-head
25
- include:
26
- - env: COMMAND=rspec
27
- gemfile: Gemfile
28
- rvm: ruby-head
29
- exclude:
30
- # Don't run the appraisal version of the specs for the base gemfile
31
- - env: COMMAND=rspec APPRAISAL_INITIALIZED=true
32
- gemfile: Gemfile
33
- # Don't run the standardrb check on any gemfile except the base gemfile
34
- # (but run it for each ruby version)
35
- - env: COMMAND="standardrb --no-fix --format progress"
36
- gemfile: gemfiles/rails_4.gemfile
37
- - env: COMMAND="standardrb --no-fix --format progress"
38
- gemfile: gemfiles/rails_5_0.gemfile
39
- - env: COMMAND="standardrb --no-fix --format progress"
40
- gemfile: gemfiles/rails_5_1.gemfile
41
- - env: COMMAND="standardrb --no-fix --format progress"
42
- gemfile: gemfiles/rails_5_2.gemfile
43
- - env: COMMAND="standardrb --no-fix --format progress"
44
- gemfile: gemfiles/rails_6.gemfile
45
- - env: COMMAND="standardrb --no-fix --format progress"
46
- gemfile: gemfiles/rails_5_0_graphiti_rails.gemfile
47
- - env: COMMAND="standardrb --no-fix --format progress"
48
- gemfile: gemfiles/rails_5_1_graphiti_rails.gemfile
49
- - env: COMMAND="standardrb --no-fix --format progress"
50
- gemfile: gemfiles/rails_5_2_graphiti_rails.gemfile
51
- - env: COMMAND="standardrb --no-fix --format progress"
52
- gemfile: gemfiles/rails_6_graphiti_rails.gemfile
53
- # Don't run the basic versions of the specs for any of the specific gemfiles
54
- - env: COMMAND=rspec
55
- gemfile: gemfiles/rails_4.gemfile
56
- - env: COMMAND=rspec
57
- gemfile: gemfiles/rails_5_0.gemfile
58
- - env: COMMAND=rspec
59
- gemfile: gemfiles/rails_5_1.gemfile
60
- - env: COMMAND=rspec
61
- gemfile: gemfiles/rails_5_2.gemfile
62
- - env: COMMAND=rspec
63
- gemfile: gemfiles/rails_6.gemfile
64
- - env: COMMAND=rspec
65
- gemfile: gemfiles/rails_5_0_graphiti_rails.gemfile
66
- - env: COMMAND=rspec
67
- gemfile: gemfiles/rails_5_1_graphiti_rails.gemfile
68
- - env: COMMAND=rspec
69
- gemfile: gemfiles/rails_5_2_graphiti_rails.gemfile
70
- - env: COMMAND=rspec
71
- gemfile: gemfiles/rails_6_graphiti_rails.gemfile
72
-
73
- # Don't run rails 4 egmfile against any rubies (for some reason?)
74
- - gemfile: gemfiles/rails_4.gemfile
75
- rvm: 2.5
76
- - gemfile: gemfiles/rails_4.gemfile
77
- rvm: 2.6
78
- - gemfile: gemfiles/rails_4.gemfile
79
- rvm: 2.7
80
-
81
- script:
82
- - bundle _1.17.3_ exec $COMMAND
83
-
84
- install: bundle _1.17.3_ install --retry=3 --jobs=3
85
- before_install:
86
- - gem install bundler -v '1.17.3'
87
- deploy:
88
- provider: rubygems
89
- api_key:
90
- secure: aON6EPWgHZXVQs+n/glMjPJ5kMpeR25khDpYlFIM0Ggf2+xuT/yRMtGbNTYnB01v/v2s9tNWK6QlMGARCbKz/W6WS8VNwFxs4DO1IPY3XoyF8QaPlXVKfBLldjUoVx61zL5xtcv8uZqWT1ATY+DjHW3nQ875ss/GW8tw+UASG1uUEuPCE9z+rNa3xYnm2qSZOwhFWqs5bHRQcc3gF3O8Hy8r4aosYTAlYOSeGDToqTUq1Ws21dV4xnIo97Nhmh9SYBQcKpZk1qF9bUz4zqdKsDKAxHMJRShtILmhPxNpIqE5ZV0+Xt+cnwi11AZDhSgfoUqYO9t2uG562luAqTnEZEQl+Lmc+nx4nJTH6tcR3ri301k0O+qDZ3PgSojJvrUuNC8DDLbbsVJNHYycGOLclqQq1aNbgz9HayEE5s+AyklPcprJhngxA5WP80AtONAxxLt4OjrY0X80TvOi2b5nfIN7DowGmcLbRahnms98Yk6/i1vCNV4R9bO0AaqpGLV+L8sVp98Qquk2mpvB3Le4W89qm5int1y2FNJbgInBpY1UOsI3wLENt0npC1X/KVMJKkpHvk80rGccI5FIVRUDZ3YD77hi+s1busPSVQ/+l4QdTFHmWp13Pghf6hNaIwfNwFMHwM2Fkv8YXa4c1mWc1cY5WP1ELS8cEnjtmp/9Iuc=
91
- gem: graphiti
92
- on:
93
- tags: true
94
- repo: graphiti-api/graphiti
@@ -1,18 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", "~> 5.0"
6
- gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
8
- gem "database_cleaner"
9
-
10
- group :test do
11
- gem "pry"
12
- gem "pry-byebug", platform: [:mri]
13
- gem "appraisal"
14
- gem "guard"
15
- gem "guard-rspec"
16
- end
17
-
18
- gemspec path: "../"
@@ -1,20 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", "~> 5.0"
6
- gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
8
- gem "database_cleaner"
9
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
10
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
11
-
12
- group :test do
13
- gem "pry"
14
- gem "pry-byebug", platform: [:mri]
15
- gem "appraisal"
16
- gem "guard"
17
- gem "guard-rspec"
18
- end
19
-
20
- gemspec path: "../"
@@ -1,20 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", "~> 5.1"
6
- gem "rspec-rails"
7
- gem "sqlite3", "~> 1.3.6"
8
- gem "database_cleaner"
9
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
10
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
11
-
12
- group :test do
13
- gem "pry"
14
- gem "pry-byebug", platform: [:mri]
15
- gem "appraisal"
16
- gem "guard"
17
- gem "guard-rspec"
18
- end
19
-
20
- gemspec path: "../"