graphiti 1.2.16 → 1.3.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +96 -0
  3. data/.standard.yml +4 -4
  4. data/Appraisals +23 -17
  5. data/CHANGELOG.md +7 -1
  6. data/Guardfile +5 -5
  7. data/deprecated_generators/graphiti/generator_mixin.rb +1 -0
  8. data/deprecated_generators/graphiti/resource_generator.rb +1 -1
  9. data/gemfiles/{rails_5.gemfile → rails_5_2.gemfile} +2 -2
  10. data/gemfiles/{rails_5_graphiti_rails.gemfile → rails_5_2_graphiti_rails.gemfile} +3 -4
  11. data/gemfiles/rails_6.gemfile +1 -1
  12. data/gemfiles/rails_6_graphiti_rails.gemfile +2 -3
  13. data/gemfiles/{rails_4.gemfile → rails_7.gemfile} +2 -2
  14. data/gemfiles/rails_7_graphiti_rails.gemfile +19 -0
  15. data/graphiti.gemspec +16 -16
  16. data/lib/graphiti/adapters/abstract.rb +20 -5
  17. data/lib/graphiti/adapters/active_record/belongs_to_sideload.rb +1 -1
  18. data/lib/graphiti/adapters/active_record/has_many_sideload.rb +1 -1
  19. data/lib/graphiti/adapters/active_record/has_one_sideload.rb +1 -1
  20. data/lib/graphiti/adapters/active_record/{inferrence.rb → inference.rb} +2 -2
  21. data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +19 -0
  22. data/lib/graphiti/adapters/active_record.rb +119 -74
  23. data/lib/graphiti/adapters/graphiti_api.rb +1 -1
  24. data/lib/graphiti/adapters/null.rb +1 -1
  25. data/lib/graphiti/adapters/persistence/associations.rb +78 -0
  26. data/lib/graphiti/configuration.rb +3 -1
  27. data/lib/graphiti/debugger.rb +12 -8
  28. data/lib/graphiti/delegates/pagination.rb +47 -13
  29. data/lib/graphiti/deserializer.rb +3 -3
  30. data/lib/graphiti/errors.rb +109 -15
  31. data/lib/graphiti/extensions/extra_attribute.rb +4 -4
  32. data/lib/graphiti/extensions/temp_id.rb +1 -1
  33. data/lib/graphiti/filter_operators.rb +0 -1
  34. data/lib/graphiti/hash_renderer.rb +198 -21
  35. data/lib/graphiti/query.rb +105 -73
  36. data/lib/graphiti/railtie.rb +5 -5
  37. data/lib/graphiti/renderer.rb +19 -1
  38. data/lib/graphiti/request_validator.rb +10 -10
  39. data/lib/graphiti/request_validators/update_validator.rb +4 -5
  40. data/lib/graphiti/request_validators/validator.rb +38 -24
  41. data/lib/graphiti/resource/configuration.rb +35 -7
  42. data/lib/graphiti/resource/dsl.rb +34 -8
  43. data/lib/graphiti/resource/interface.rb +13 -3
  44. data/lib/graphiti/resource/links.rb +3 -3
  45. data/lib/graphiti/resource/persistence.rb +2 -1
  46. data/lib/graphiti/resource/polymorphism.rb +8 -2
  47. data/lib/graphiti/resource/remote.rb +2 -2
  48. data/lib/graphiti/resource/sideloading.rb +4 -4
  49. data/lib/graphiti/resource.rb +12 -1
  50. data/lib/graphiti/resource_proxy.rb +23 -3
  51. data/lib/graphiti/runner.rb +5 -5
  52. data/lib/graphiti/schema.rb +36 -11
  53. data/lib/graphiti/schema_diff.rb +44 -4
  54. data/lib/graphiti/scope.rb +8 -10
  55. data/lib/graphiti/scoping/base.rb +3 -3
  56. data/lib/graphiti/scoping/filter.rb +36 -15
  57. data/lib/graphiti/scoping/filter_group_validator.rb +78 -0
  58. data/lib/graphiti/scoping/paginate.rb +47 -3
  59. data/lib/graphiti/scoping/sort.rb +5 -7
  60. data/lib/graphiti/serializer.rb +49 -7
  61. data/lib/graphiti/sideload/belongs_to.rb +1 -1
  62. data/lib/graphiti/sideload/has_many.rb +19 -1
  63. data/lib/graphiti/sideload/many_to_many.rb +11 -4
  64. data/lib/graphiti/sideload/polymorphic_belongs_to.rb +3 -4
  65. data/lib/graphiti/sideload.rb +47 -23
  66. data/lib/graphiti/stats/dsl.rb +0 -1
  67. data/lib/graphiti/stats/payload.rb +12 -9
  68. data/lib/graphiti/types.rb +15 -15
  69. data/lib/graphiti/util/attribute_check.rb +1 -1
  70. data/lib/graphiti/util/class.rb +6 -0
  71. data/lib/graphiti/util/link.rb +10 -2
  72. data/lib/graphiti/util/persistence.rb +21 -78
  73. data/lib/graphiti/util/relationship_payload.rb +4 -4
  74. data/lib/graphiti/util/remote_params.rb +9 -4
  75. data/lib/graphiti/util/remote_serializer.rb +1 -0
  76. data/lib/graphiti/util/serializer_attributes.rb +41 -11
  77. data/lib/graphiti/util/simple_errors.rb +4 -4
  78. data/lib/graphiti/util/transaction_hooks_recorder.rb +1 -1
  79. data/lib/graphiti/version.rb +1 -1
  80. data/lib/graphiti.rb +6 -3
  81. metadata +46 -37
  82. data/.travis.yml +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cf06fc44b5ea470fcaaa4eb090abec15ce864b116f7dcb57d76dd9ca97c41ba
4
- data.tar.gz: 5b60d753e401ff3cc93613f064de5c686746c855033f9ef046616426222cc379
3
+ metadata.gz: 30f5b9382256603c1f3f8f4ab8c4e614804c1a2e2152617d7b19892bca6bd465
4
+ data.tar.gz: 948837bfa0f8deee2f44849aba9df2bb18f2fdf532a1caaab92b16c7d9ba91fd
5
5
  SHA512:
6
- metadata.gz: f5e22a684fccd5b670c22423dead0bac0ec3d242157f5f8f2e030c7469c6f951471d161168f0f7bd75c0ab05c5a5e04b88d7b0002750746e583719a6b50f3215
7
- data.tar.gz: fdd3d58e32f14d3437ff4d4d5d0cc8619ca78673a3d37f83393e6957462218d9a7904df2f6690ab6a8eb1595e80b4f3ab63380d978a7d9b4d69ab03cb3f1bd8e
6
+ metadata.gz: 4fe6fff9c219fd463378bbdc793f648cbeffe27c61c191f11e2aab4723e952d2d8f7cc26b334255e12adca3e9d819b1bbde17697a6621f11a28151d2649d6d9c
7
+ data.tar.gz: becca9eaa17f328a99669e1e855a4024862b45d1902ddf30de597f7b33e3f52e4145b0f1dba1542a0d144ba2bc1bdec280ad9d8fa599a102ead9efb5260e1ab3
@@ -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,38 +1,44 @@
1
- appraise "rails-4" do
2
- gem "rails", "~> 4.1"
1
+ appraise "rails-5_2" do
2
+ gem "rails", "~> 5.2.0"
3
3
  gem "rspec-rails"
4
- gem "sqlite3", "~> 1.3.6"
4
+ gem "sqlite3", "~> 1.4.0"
5
5
  gem "database_cleaner"
6
6
  end
7
7
 
8
- appraise "rails-5" do
9
- gem "rails", "~> 5.2"
8
+ appraise "rails-5_2-graphiti-rails" do
9
+ gem "rails", "~> 5.2.0"
10
10
  gem "rspec-rails"
11
- gem "sqlite3", "~> 1.3.6"
11
+ gem "sqlite3", "~> 1.4.0"
12
12
  gem "database_cleaner"
13
+ gem "graphiti-rails", "~> 0.4.0"
13
14
  end
14
15
 
15
- appraise "rails-5-graphiti-rails" do
16
- gem "rails", "~> 5.2"
16
+ appraise "rails-6" do
17
+ gem "rails", "~> 6.0"
17
18
  gem "rspec-rails"
18
- gem "sqlite3", "~> 1.3.6"
19
+ gem "sqlite3", "~> 1.4.0"
19
20
  gem "database_cleaner"
20
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
21
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
22
21
  end
23
22
 
24
- appraise "rails-6" do
25
- gem "rails", "~> 6.0.0.rc1"
23
+ appraise "rails-6-graphiti-rails" do
24
+ gem "rails", "~> 6.0"
26
25
  gem "rspec-rails"
27
26
  gem "sqlite3", "~> 1.4.0"
28
27
  gem "database_cleaner"
28
+ gem "graphiti-rails", "~> 0.4.0"
29
29
  end
30
30
 
31
- appraise "rails-6-graphiti-rails" do
32
- gem "rails", "~> 6.0.0.rc1"
31
+ appraise "rails-7" do
32
+ gem "rails", "~> 7.0"
33
+ gem "rspec-rails"
34
+ gem "sqlite3", "~> 1.4.0"
35
+ gem "database_cleaner"
36
+ end
37
+
38
+ appraise "rails-7-graphiti-rails" do
39
+ gem "rails", "~> 7.0"
33
40
  gem "rspec-rails"
34
41
  gem "sqlite3", "~> 1.4.0"
35
42
  gem "database_cleaner"
36
- gem "rescue_registry", git: "https://github.com/wagenet/rescue_registry.git", branch: "master"
37
- gem "graphiti-rails", git: "https://github.com/wagenet/graphiti-rails.git", branch: "master"
43
+ gem "graphiti-rails", "~> 0.4.0"
38
44
  end
data/CHANGELOG.md CHANGED
@@ -1,13 +1,19 @@
1
1
  ## Unreleased
2
2
 
3
3
  Features:
4
-
4
+ - [329](https://github.com/graphiti-api/graphiti/pull/329) Propagate `extra_fields` to related resource links.
5
+ - [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
6
  - [158](https://github.com/graphiti-api/graphiti/pull/158) Filters options `allow_nil: true`
6
7
  Option can be set at the resource level `Resource.filters_accept_nil_by_default = true`.
7
8
  By default this is set to false. (@zeisler)
8
9
  - [157](https://github.com/graphiti-api/graphiti/pull/157) Using attribute option schema: false.
9
10
  This option is default true and is not effected by only and except options. (@zeisler)
10
11
 
12
+ Fixes:
13
+ - [282] Support model names including "Resource"
14
+ - [313](https://github.com/graphiti-api/graphiti/pull/313) Sort remote resources in schema generation
15
+ - [374](https://github.com/graphiti-api/graphiti/pull/374) Trim leading spaces from error messages
16
+
11
17
  ## 1.1.0
12
18
 
13
19
  Features:
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/(.*)\/?(.*)_spec\.rb$})
4
+ watch(%r{^spec/(.*)/?(.*)_spec\.rb$})
5
5
 
6
6
  # Feel free to open issues for suggestions and improvements
7
7
 
@@ -21,12 +21,12 @@ guard :rspec, cmd: "bundle exec rspec --color --format documentation" do
21
21
  watch(rails.controllers) do |m|
22
22
  [
23
23
  rspec.spec.call("controllers/#{m[1]}_controller"),
24
- rspec.spec.call("api/#{m[1]}"),
24
+ rspec.spec.call("api/#{m[1]}")
25
25
  ]
26
26
  end
27
27
 
28
28
  # Rails config changes
29
- watch(rails.spec_helper) { rspec.spec_dir }
30
- watch(rails.routes) { "#{rspec.spec_dir}/routing" }
31
- watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
29
+ watch(rails.spec_helper) { rspec.spec_dir }
30
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
31
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
32
32
  end
@@ -12,6 +12,7 @@ module Graphiti
12
12
  def api_namespace
13
13
  @api_namespace ||= begin
14
14
  ns = graphiti_config["namespace"]
15
+ ns.delete_suffix("/")
15
16
 
16
17
  if ns.blank?
17
18
  ns = prompt \
@@ -93,7 +93,7 @@ module Graphiti
93
93
  raise "Unable to set #{self} default_attributes from #{attributes_class}. #{attributes_class} must be a kind of ApplicationRecord"
94
94
  end
95
95
  if attributes_class.table_exists?
96
- return attributes_class.columns.map do |c|
96
+ attributes_class.columns.map do |c|
97
97
  OpenStruct.new({name: c.name.to_sym, type: c.type})
98
98
  end
99
99
  else
@@ -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"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 6.0.0"
5
+ gem "rails", "~> 6.0"
6
6
  gem "rspec-rails"
7
7
  gem "sqlite3", "~> 1.4.0"
8
8
  gem "database_cleaner"
@@ -2,12 +2,11 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 6.0.0"
5
+ 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", "~> 4.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
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 7.0"
6
+ gem "rspec-rails"
7
+ gem "sqlite3", "~> 1.4.0"
8
+ gem "database_cleaner"
9
+ gem "graphiti-rails", "~> 0.4.0"
10
+
11
+ group :test do
12
+ gem "pry"
13
+ gem "pry-byebug", platform: [:mri]
14
+ gem "appraisal"
15
+ gem "guard"
16
+ gem "guard-rspec"
17
+ end
18
+
19
+ gemspec path: "../"
data/graphiti.gemspec CHANGED
@@ -3,33 +3,33 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "graphiti/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "graphiti"
7
- spec.version = Graphiti::VERSION
8
- spec.authors = ["Lee Richmond"]
9
- spec.email = ["richmolj@gmail.com"]
6
+ spec.name = "graphiti"
7
+ spec.version = Graphiti::VERSION
8
+ spec.authors = ["Lee Richmond"]
9
+ spec.email = ["richmolj@gmail.com"]
10
10
 
11
- spec.summary = "Easily build jsonapi.org-compatible APIs"
12
- spec.homepage = "https://github.com/graphiti-api/graphiti"
13
- spec.license = "MIT"
11
+ spec.summary = "Easily build jsonapi.org-compatible APIs"
12
+ spec.homepage = "https://github.com/graphiti-api/graphiti"
13
+ spec.license = "MIT"
14
14
 
15
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
- spec.bindir = "exe"
17
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
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"
19
+ spec.required_ruby_version = ">= 2.6"
20
20
 
21
21
  spec.add_dependency "jsonapi-serializable", "~> 0.3.0"
22
- spec.add_dependency "jsonapi-renderer", "0.2.0"
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 "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"
33
34
  spec.add_development_dependency "graphiti_spec_helpers", "1.0.beta.4"
34
- spec.add_development_dependency "standard"
35
35
  end
@@ -1,6 +1,9 @@
1
1
  module Graphiti
2
2
  module Adapters
3
3
  class Abstract
4
+ require "graphiti/adapters/persistence/associations"
5
+ include Graphiti::Adapters::Persistence::Associations
6
+
4
7
  attr_reader :resource
5
8
 
6
9
  def initialize(resource)
@@ -17,7 +20,7 @@ module Graphiti
17
20
  belongs_to: ::Graphiti::Sideload::BelongsTo,
18
21
  has_one: ::Graphiti::Sideload::HasOne,
19
22
  many_to_many: ::Graphiti::Sideload::ManyToMany,
20
- polymorphic_belongs_to: ::Graphiti::Sideload::PolymorphicBelongsTo,
23
+ polymorphic_belongs_to: ::Graphiti::Sideload::PolymorphicBelongsTo
21
24
  }
22
25
  end
23
26
 
@@ -33,7 +36,7 @@ module Graphiti
33
36
  :suffix,
34
37
  :not_suffix,
35
38
  :match,
36
- :not_match,
39
+ :not_match
37
40
  ],
38
41
  uuid: [:eq, :not_eq],
39
42
  enum: [:eq, :not_eq],
@@ -45,7 +48,7 @@ module Graphiti
45
48
  date: numerical_operators,
46
49
  datetime: numerical_operators,
47
50
  hash: [:eq],
48
- array: [:eq],
51
+ array: [:eq]
49
52
  }
50
53
  end
51
54
 
@@ -241,14 +244,15 @@ module Graphiti
241
244
  # @param scope The scope object we are chaining
242
245
  # @param [Integer] current_page The current page number
243
246
  # @param [Integer] per_page The number of results per page
247
+ # @param [Integer] offset The offset to start from
244
248
  # @return the scope
245
249
  #
246
250
  # @example ActiveRecord default
247
251
  # # via kaminari gem
248
- # def paginate(scope, current_page, per_page)
252
+ # def paginate(scope, current_page, per_page, offset)
249
253
  # scope.page(current_page).per(per_page)
250
254
  # end
251
- def paginate(scope, current_page, per_page)
255
+ def paginate(scope, current_page, per_page, offset)
252
256
  raise "you must override #paginate in an adapter subclass"
253
257
  end
254
258
 
@@ -400,10 +404,21 @@ module Graphiti
400
404
  raise "you must override #destroy in an adapter subclass"
401
405
  end
402
406
 
407
+ def close
408
+ end
409
+
410
+ def persistence_attributes(persistance, attributes)
411
+ attributes
412
+ end
413
+
403
414
  def self.numerical_operators
404
415
  [:eq, :not_eq, :gt, :gte, :lt, :lte].freeze
405
416
  end
406
417
 
418
+ def can_group?
419
+ false
420
+ end
421
+
407
422
  private
408
423
 
409
424
  def activerecord_adapter
@@ -1,5 +1,5 @@
1
1
  class Graphiti::Adapters::ActiveRecord::BelongsToSideload < Graphiti::Sideload::BelongsTo
2
- include Graphiti::Adapters::ActiveRecord::Inferrence
2
+ include Graphiti::Adapters::ActiveRecord::Inference
3
3
 
4
4
  def default_base_scope
5
5
  resource_class.model.all
@@ -1,5 +1,5 @@
1
1
  class Graphiti::Adapters::ActiveRecord::HasManySideload < Graphiti::Sideload::HasMany
2
- include Graphiti::Adapters::ActiveRecord::Inferrence
2
+ include Graphiti::Adapters::ActiveRecord::Inference
3
3
 
4
4
  def default_base_scope
5
5
  resource_class.model.all
@@ -1,5 +1,5 @@
1
1
  class Graphiti::Adapters::ActiveRecord::HasOneSideload < Graphiti::Sideload::HasOne
2
- include Graphiti::Adapters::ActiveRecord::Inferrence
2
+ include Graphiti::Adapters::ActiveRecord::Inference
3
3
 
4
4
  def default_base_scope
5
5
  resource_class.model.all
@@ -1,6 +1,6 @@
1
- module Graphiti::Adapters::ActiveRecord::Inferrence
1
+ module Graphiti::Adapters::ActiveRecord::Inference
2
2
  # If going AR to AR, use AR introspection
3
- # If going AR to PORO, fall back to normal inferrence
3
+ # If going AR to PORO, fall back to normal inference
4
4
  def infer_foreign_key
5
5
  parent_model = parent_resource_class.model
6
6
  reflection = parent_model.reflections[association_name.to_s]
@@ -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|
@@ -75,4 +87,11 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
75
87
  value = through_reflection.foreign_key.to_sym
76
88
  {key => value}
77
89
  end
90
+
91
+ def infer_inverse_association
92
+ through_class = through_reflection.klass
93
+
94
+ foreign_reflection = through_class.reflections[name.to_s.singularize]
95
+ foreign_reflection && foreign_reflection.options[:inverse_of]
96
+ end
78
97
  end