arel_toolkit 0.2.0 → 0.3.0

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +8 -0
  4. data/CHANGELOG.md +56 -7
  5. data/Gemfile.lock +54 -1
  6. data/Guardfile +19 -12
  7. data/README.md +56 -2
  8. data/Rakefile +8 -0
  9. data/arel_toolkit.gemspec +6 -0
  10. data/bin/console +1 -0
  11. data/lib/arel/extensions/assignment.rb +22 -0
  12. data/lib/arel/extensions/at_time_zone.rb +30 -0
  13. data/lib/arel/extensions/contained_within_equals.rb +10 -0
  14. data/lib/arel/extensions/contains.rb +2 -2
  15. data/lib/arel/extensions/contains_equals.rb +10 -0
  16. data/lib/arel/extensions/delete_manager.rb +9 -0
  17. data/lib/arel/extensions/delete_statement.rb +7 -0
  18. data/lib/arel/extensions/distinct_from.rb +3 -16
  19. data/lib/arel/extensions/equality.rb +2 -4
  20. data/lib/arel/extensions/extract_from.rb +32 -0
  21. data/lib/arel/extensions/insert_manager.rb +5 -0
  22. data/lib/arel/extensions/insert_statement.rb +10 -3
  23. data/lib/arel/extensions/json_get_field.rb +10 -0
  24. data/lib/arel/extensions/json_get_object.rb +10 -0
  25. data/lib/arel/extensions/json_path_get_field.rb +10 -0
  26. data/lib/arel/extensions/json_path_get_object.rb +10 -0
  27. data/lib/arel/extensions/jsonb_all_key_exists.rb +10 -0
  28. data/lib/arel/extensions/jsonb_any_key_exists.rb +10 -0
  29. data/lib/arel/extensions/jsonb_key_exists.rb +10 -0
  30. data/lib/arel/extensions/named_argument.rb +29 -0
  31. data/lib/arel/extensions/not_distinct_from.rb +3 -16
  32. data/lib/arel/extensions/not_equal.rb +2 -4
  33. data/lib/arel/extensions/overlap.rb +1 -1
  34. data/lib/arel/extensions/overlaps.rb +40 -0
  35. data/lib/arel/extensions/overlay.rb +44 -0
  36. data/lib/arel/extensions/position.rb +32 -0
  37. data/lib/arel/extensions/select_manager.rb +9 -0
  38. data/lib/arel/extensions/substring.rb +38 -0
  39. data/lib/arel/extensions/transaction.rb +50 -0
  40. data/lib/arel/extensions/trim.rb +36 -0
  41. data/lib/arel/extensions/type_cast.rb +4 -0
  42. data/lib/arel/{sql_to_arel → extensions}/unbound_column_reference.rb +1 -1
  43. data/lib/arel/extensions/update_manager.rb +9 -0
  44. data/lib/arel/extensions/update_statement.rb +8 -0
  45. data/lib/arel/extensions/variable_set.rb +46 -0
  46. data/lib/arel/extensions/variable_show.rb +31 -0
  47. data/lib/arel/extensions.rb +26 -0
  48. data/lib/arel/middleware/chain.rb +97 -0
  49. data/lib/arel/middleware/postgresql_adapter.rb +26 -0
  50. data/lib/arel/middleware/railtie.rb +11 -0
  51. data/lib/arel/middleware.rb +23 -0
  52. data/lib/arel/sql_formatter.rb +59 -0
  53. data/lib/arel/sql_to_arel/error.rb +6 -0
  54. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +112 -0
  55. data/lib/arel/sql_to_arel/pg_query_visitor.rb +271 -52
  56. data/lib/arel/sql_to_arel/result.rb +17 -0
  57. data/lib/arel/sql_to_arel.rb +4 -3
  58. data/lib/arel_toolkit/version.rb +1 -1
  59. data/lib/arel_toolkit.rb +2 -0
  60. metadata +120 -4
  61. data/lib/arel/sql_to_arel/frame_options.rb +0 -110
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71faaa5416ecd1e04fec3cbeb1ea22104738027adc65941630c5b3e98b87a666
4
- data.tar.gz: 15484e5f9677367fcd82291d29bd2a0f09c2d56634af5880f78e0f2cca532b55
3
+ metadata.gz: 12a7a7083cd421854ed6034a0a1cbf83352439d843d7414225267599e9d5a0af
4
+ data.tar.gz: db2a316896694e49edce2ee52aab4f2283781e45347acaea23fac1fd5dbbf5a9
5
5
  SHA512:
6
- metadata.gz: b452f4200412105997f2d68d22febe6d98fec579b734bf09aa9a3c1408b25e3d1fe744f8eb7a24bccaf8b3969afc05d1a04eccc8d194e6e7cabb39c5ab3ec74f
7
- data.tar.gz: 37f3fdc0e2612ab325247861b159c8621c66b46e07267b4c5d9e34eff19c3068117165c5a1adb803c086d144fd325bb813e67ff73370d925bf9bf283e2ff602e
6
+ metadata.gz: 1b77b18061a8332e5e6aa9fe0288fb2526309604f17eb3751d0c363ea1349aaa158fad5106fee32e0a3064cbc21615e1930dd0e59012b92648e75a96cc488190
7
+ data.tar.gz: 5b04edcfc25b94cb44ac93d4c7472bc7e4d380c20a1d750c41f56e52b754cb0e023b5758e8c35dd2477037e6ff9ca0d2b0aaf5dc7825063fa5b053be7142c142
data/.rubocop.yml CHANGED
@@ -7,6 +7,9 @@ Bundler/OrderedGems:
7
7
  Gemspec/OrderedDependencies:
8
8
  Enabled: false
9
9
 
10
+ Style/MultilineBlockChain:
11
+ Enabled: false
12
+
10
13
  Metrics/LineLength:
11
14
  Enabled: true
12
15
  Max: 100
data/.travis.yml CHANGED
@@ -19,3 +19,11 @@ script:
19
19
  - bundle exec rspec spec
20
20
  after_script:
21
21
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
22
+ deploy:
23
+ provider: pages
24
+ skip_cleanup: true
25
+ github_token: $GITHUB_TOKEN
26
+ local_dir: ./coverage
27
+ keep_history: true
28
+ on:
29
+ branch: master
data/CHANGELOG.md CHANGED
@@ -1,10 +1,59 @@
1
- # Changelog
1
+ # Change Log
2
2
 
3
- ## 0.2.0 (31st of May 2019)
3
+ ## [v0.3.0](https://github.com/mvgijssel/arel_toolkit/tree/v0.3.0) (2019-07-01)
4
+ [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.2.0...v0.3.0)
4
5
 
5
- ### New features
6
+ **Implemented enhancements:**
6
7
 
7
- - Support generating Arel::InsertManager from PostgresQL INSERT statements
8
- - Support generating Arel::SelectManager from PostgresQL SELECT statements
9
- - Support generating Arel::UpdateManager from PostgresQL UPDATE statements
10
- - Support generating Arel::DeleteManager from PostgresQL DELETE statements
8
+ - Implement Functions and Operators from PostgreSQL docs [\#84](https://github.com/mvgijssel/arel_toolkit/issues/84)
9
+ - Implement more missing operators and visitors [\#82](https://github.com/mvgijssel/arel_toolkit/issues/82)
10
+ - Improve error message when unable to parse sql to arel [\#71](https://github.com/mvgijssel/arel_toolkit/issues/71)
11
+ - Publish coverage information to GitHub pages [\#64](https://github.com/mvgijssel/arel_toolkit/issues/64)
12
+ - Add ActiveRecord comparison testing [\#61](https://github.com/mvgijssel/arel_toolkit/issues/61)
13
+ - Make Arel::TreeManager equal to other trees [\#59](https://github.com/mvgijssel/arel_toolkit/issues/59)
14
+ - Add support for Arel.middleware [\#52](https://github.com/mvgijssel/arel_toolkit/issues/52)
15
+ - Handle multiple tree entries in pg\_query\_visitor\#accept [\#33](https://github.com/mvgijssel/arel_toolkit/issues/33)
16
+
17
+ **Fixed bugs:**
18
+
19
+ - Fix invalid generated SQL, add missing visitors and extend operators [\#79](https://github.com/mvgijssel/arel_toolkit/issues/79)
20
+ - Fix handling of equality with Arel::Nodes::Quoted [\#77](https://github.com/mvgijssel/arel_toolkit/issues/77)
21
+ - Fix default values for Delete- and UpdateStatement [\#75](https://github.com/mvgijssel/arel_toolkit/issues/75)
22
+ - Unknown operator `` for IN statement [\#73](https://github.com/mvgijssel/arel_toolkit/issues/73)
23
+ - NameError: undefined local variable or method `number' for \#\<Arel::SqlToArel::PgQueryVisitor:0x000055dfdd14c6f8\> [\#69](https://github.com/mvgijssel/arel_toolkit/issues/69)
24
+ - Make compatible with postgres\_ext [\#67](https://github.com/mvgijssel/arel_toolkit/issues/67)
25
+
26
+ **Closed issues:**
27
+
28
+ - File issues for commented out rspec test [\#51](https://github.com/mvgijssel/arel_toolkit/issues/51)
29
+
30
+ ## [v0.2.0](https://github.com/mvgijssel/arel_toolkit/tree/v0.2.0) (2019-05-30)
31
+ [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.1.0...v0.2.0)
32
+
33
+ **Implemented enhancements:**
34
+
35
+ - Handle op in pg\_query\_visitor\#visit\_SelectStmt [\#38](https://github.com/mvgijssel/arel_toolkit/issues/38)
36
+ - Add WITH, OVERRIDING and RETURNING to INSERT [\#28](https://github.com/mvgijssel/arel_toolkit/issues/28)
37
+ - Return \(Select|Update|Insert|Delete\)Manager instead of \(Select|Update|Insert|Delete\)Statement [\#25](https://github.com/mvgijssel/arel_toolkit/issues/25)
38
+ - Implement UNION in sql\_to\_arel [\#24](https://github.com/mvgijssel/arel_toolkit/issues/24)
39
+ - Extract Arel extensions to their own files [\#23](https://github.com/mvgijssel/arel_toolkit/issues/23)
40
+ - Implement pg\_query\_visitor method for DELETE [\#22](https://github.com/mvgijssel/arel_toolkit/issues/22)
41
+ - Implement pg\_query\_visitor method for INSERT [\#21](https://github.com/mvgijssel/arel_toolkit/issues/21)
42
+ - Implement pg\_query\_visitor method for UPDATE [\#20](https://github.com/mvgijssel/arel_toolkit/issues/20)
43
+ - Implement all the visitor methods in PgQueryVisitor for SELECT statements [\#11](https://github.com/mvgijssel/arel_toolkit/issues/11)
44
+ - Introduce Guard [\#5](https://github.com/mvgijssel/arel_toolkit/issues/5)
45
+
46
+ **Fixed bugs:**
47
+
48
+ - Fix CodeClimate coverage [\#8](https://github.com/mvgijssel/arel_toolkit/issues/8)
49
+
50
+ **Closed issues:**
51
+
52
+ - Create issues for unknown branches in pg\_query\_visitor [\#19](https://github.com/mvgijssel/arel_toolkit/issues/19)
53
+ - Remove unnecessary to\_arel remains [\#15](https://github.com/mvgijssel/arel_toolkit/issues/15)
54
+ - Merge to\_arel gem [\#4](https://github.com/mvgijssel/arel_toolkit/issues/4)
55
+
56
+ ## [v0.1.0](https://github.com/mvgijssel/arel_toolkit/tree/v0.1.0) (2019-05-16)
57
+
58
+
59
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/Gemfile.lock CHANGED
@@ -1,24 +1,54 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arel_toolkit (0.2.0)
4
+ arel_toolkit (0.3.0)
5
+ activerecord (~> 5.2.0)
5
6
  arel (~> 9.0.0)
7
+ pg (~> 1.1.4)
6
8
  pg_query (~> 1.1.0)
7
9
 
8
10
  GEM
9
11
  remote: https://rubygems.org/
10
12
  specs:
13
+ activemodel (5.2.3)
14
+ activesupport (= 5.2.3)
15
+ activerecord (5.2.3)
16
+ activemodel (= 5.2.3)
17
+ activesupport (= 5.2.3)
18
+ arel (>= 9.0)
19
+ activesupport (5.2.3)
20
+ concurrent-ruby (~> 1.0, >= 1.0.2)
21
+ i18n (>= 0.7, < 2)
22
+ minitest (~> 5.1)
23
+ tzinfo (~> 1.1)
24
+ addressable (2.6.0)
25
+ public_suffix (>= 2.0.2, < 4.0)
11
26
  ansi (1.5.0)
12
27
  arel (9.0.0)
13
28
  ast (2.4.0)
14
29
  binding_of_caller (0.8.0)
15
30
  debug_inspector (>= 0.0.1)
16
31
  coderay (1.1.2)
32
+ concurrent-ruby (1.1.5)
33
+ database_cleaner (1.7.0)
17
34
  debug_inspector (0.0.3)
18
35
  diff-lcs (1.3)
19
36
  docile (1.3.1)
37
+ dpl (1.10.11)
38
+ faraday (0.15.4)
39
+ multipart-post (>= 1.2, < 3)
40
+ faraday-http-cache (2.0.0)
41
+ faraday (~> 0.8)
20
42
  ffi (1.11.1)
21
43
  formatador (0.2.5)
44
+ github_changelog_generator (1.14.3)
45
+ activesupport
46
+ faraday-http-cache
47
+ multi_json
48
+ octokit (~> 4.6)
49
+ rainbow (>= 2.1)
50
+ rake (>= 10.0)
51
+ retriable (~> 2.1)
22
52
  guard (2.15.0)
23
53
  formatador (>= 0.2.4)
24
54
  listen (>= 2.7, < 4.0)
@@ -33,7 +63,12 @@ GEM
33
63
  guard (~> 2.1)
34
64
  guard-compat (~> 1.1)
35
65
  rspec (>= 2.99.0, < 4.0)
66
+ guard-rubocop (1.3.0)
67
+ guard (~> 2.0)
68
+ rubocop (~> 0.20)
36
69
  hirb (0.7.3)
70
+ i18n (1.6.0)
71
+ concurrent-ruby (~> 1.0)
37
72
  interception (0.5)
38
73
  jaro_winkler (1.5.2)
39
74
  json (2.2.0)
@@ -43,13 +78,19 @@ GEM
43
78
  ruby_dep (~> 1.2)
44
79
  lumberjack (1.0.13)
45
80
  method_source (0.9.2)
81
+ minitest (5.11.3)
82
+ multi_json (1.13.1)
83
+ multipart-post (2.1.1)
46
84
  nenv (0.3.0)
47
85
  notiffany (0.1.1)
48
86
  nenv (~> 0.1)
49
87
  shellany (~> 0.0)
88
+ octokit (4.14.0)
89
+ sawyer (~> 0.8.0, >= 0.5.3)
50
90
  parallel (1.17.0)
51
91
  parser (2.6.3.0)
52
92
  ast (~> 2.4.0)
93
+ pg (1.1.4)
53
94
  pg_query (1.1.0)
54
95
  pry (0.12.2)
55
96
  coderay (~> 1.1.0)
@@ -65,11 +106,13 @@ GEM
65
106
  pry-stack_explorer (0.4.9.3)
66
107
  binding_of_caller (>= 0.7)
67
108
  pry (>= 0.9.11)
109
+ public_suffix (3.1.1)
68
110
  rainbow (3.0.0)
69
111
  rake (10.5.0)
70
112
  rb-fsevent (0.10.3)
71
113
  rb-inotify (0.10.0)
72
114
  ffi (~> 1.0)
115
+ retriable (2.1.0)
73
116
  rspec (3.8.0)
74
117
  rspec-core (~> 3.8.0)
75
118
  rspec-expectations (~> 3.8.0)
@@ -92,6 +135,9 @@ GEM
92
135
  unicode-display_width (>= 1.4.0, < 1.7)
93
136
  ruby-progressbar (1.10.0)
94
137
  ruby_dep (1.5.0)
138
+ sawyer (0.8.2)
139
+ addressable (>= 2.3.5)
140
+ faraday (> 0.8, < 2.0)
95
141
  shellany (0.0.1)
96
142
  simplecov (0.16.1)
97
143
  docile (~> 1.1)
@@ -103,6 +149,9 @@ GEM
103
149
  simplecov
104
150
  simplecov-html (0.10.2)
105
151
  thor (0.20.3)
152
+ thread_safe (0.3.6)
153
+ tzinfo (1.2.5)
154
+ thread_safe (~> 0.1)
106
155
  unicode-display_width (1.6.0)
107
156
 
108
157
  PLATFORMS
@@ -111,8 +160,12 @@ PLATFORMS
111
160
  DEPENDENCIES
112
161
  arel_toolkit!
113
162
  bundler (~> 2.0)
163
+ database_cleaner (~> 1.7.0)
164
+ dpl (~> 1.10.11)
165
+ github_changelog_generator (~> 1.14.3)
114
166
  guard (~> 2.15)
115
167
  guard-rspec (~> 4.7)
168
+ guard-rubocop (~> 1.3.0)
116
169
  pry
117
170
  pry-alias
118
171
  pry-nav
data/Guardfile CHANGED
@@ -24,19 +24,26 @@
24
24
  # * zeus: 'zeus rspec' (requires the server to be started separately)
25
25
  # * 'just' rspec: 'rspec'
26
26
 
27
- guard :rspec, cmd: 'bundle exec rspec', failed_mode: :focus do
28
- require 'guard/rspec/dsl'
29
- dsl = Guard::RSpec::Dsl.new(self)
27
+ group :red_green_refactor, halt_on_fail: true do
28
+ guard :rspec, cmd: 'bundle exec rspec', failed_mode: :focus do
29
+ require 'guard/rspec/dsl'
30
+ dsl = Guard::RSpec::Dsl.new(self)
30
31
 
31
- # Feel free to open issues for suggestions and improvements
32
+ # Feel free to open issues for suggestions and improvements
32
33
 
33
- # RSpec files
34
- rspec = dsl.rspec
35
- watch(rspec.spec_helper) { rspec.spec_dir }
36
- watch(rspec.spec_support) { rspec.spec_dir }
37
- watch(rspec.spec_files)
34
+ # RSpec files
35
+ rspec = dsl.rspec
36
+ watch(rspec.spec_helper) { rspec.spec_dir }
37
+ watch(rspec.spec_support) { rspec.spec_dir }
38
+ watch(rspec.spec_files)
38
39
 
39
- # Ruby files
40
- ruby = dsl.ruby
41
- dsl.watch_spec_files_for(ruby.lib_files)
40
+ # Ruby files
41
+ ruby = dsl.ruby
42
+ dsl.watch_spec_files_for(ruby.lib_files)
43
+ end
44
+
45
+ guard :rubocop do
46
+ watch(/.+\.rb$/)
47
+ watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
48
+ end
42
49
  end
data/README.md CHANGED
@@ -9,6 +9,7 @@
9
9
  - [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
10
  - ![](http://ruby-gem-downloads-badge.herokuapp.com/arel_toolkit?type=total)
11
11
  - ![](http://ruby-gem-downloads-badge.herokuapp.com/arel_toolkit?label=downloads-current-version)
12
+ - [Coverage report](https://mvgijssel.github.io/arel_toolkit/)
12
13
 
13
14
  ## Installation
14
15
 
@@ -28,7 +29,7 @@ Or install it yourself as:
28
29
 
29
30
  ## sql_to_arel
30
31
 
31
- Convert your (PostgreSQL) SQL into Arel.
32
+ Convert your (PostgreSQL) SQL into an Arel AST.
32
33
 
33
34
  ```ruby
34
35
  [1] > sql = 'SELECT id FROM users'
@@ -41,7 +42,60 @@ Convert your (PostgreSQL) SQL into Arel.
41
42
 
42
43
  ## Extensions
43
44
 
44
- Adds some missing Arel nodes and extends the existing visitors.
45
+ Adds missing Arel nodes and extends the existing visitors, [lib/arel/extensions](https://github.com/mvgijssel/arel_toolkit/tree/master/lib/arel/extensions) for a full list.
46
+
47
+ ## Middleware
48
+
49
+ The middleware sits between ActiveRecord and the database, which allows you to mutate or log queries before they hit the database. Multiple middleware are supported by passing the results from a finished middleware to the next. User defined context will be passed, which can contains things like the `current_user_id`.
50
+
51
+ ### Example
52
+
53
+ Create an initializer in Rails which loads the Arel::Middleware **after** ActiveRecord:
54
+
55
+ ```ruby
56
+ ActiveSupport.on_load :active_record do
57
+ Arel::Middleware::Railtie.insert_postgresql
58
+ end
59
+ ```
60
+
61
+ Create some middleware (can be any Ruby object which responds to `call`):
62
+
63
+ ```ruby
64
+ class ReorderMiddleware
65
+ def self.call(arel, _context)
66
+ arel.order(Post.arel_table[:id].asc)
67
+ end
68
+ end
69
+
70
+ class LoggingMiddleware
71
+ def self.call(arel, context)
72
+ puts "User executing query: `#{context[:current_user_id]}`"
73
+ puts "Original SQL: `#{context[:original_sql]}`"
74
+ puts "Modified SQL: `#{arel.to_sql}`"
75
+ arel
76
+ end
77
+ end
78
+ ```
79
+
80
+ Run a query with middleware applied
81
+
82
+ ```ruby
83
+ [1] > Arel.middleware.apply([ReorderMiddleware, LoggingMiddleware]).context(current_user_id: 1) { Post.all.load }
84
+ User executing query: `1`
85
+ Original SQL: `SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC`
86
+ Modified SQL: `SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC, "posts"."id" ASC`
87
+ Post Load (4.1ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC, "posts"."id" ASC
88
+ => []
89
+ ```
90
+
91
+ There are more methods available to help with ordering and modifying of the current applied middleware:
92
+
93
+ - `Arel.middleware.apply([SomeMiddleware]) { ... }`
94
+ - `Arel.middleware.only([OnlyMe]) { ... }`
95
+ - `Arel.middleware.none { ... }`
96
+ - `Arel.middleware.except(RemoveMe) { ... }`
97
+ - `Arel.middleware.insert_before(RunBefore, ThisMiddleware) { ... }`
98
+ - `Arel.middleware.insert_after(RunAfter, ThisMiddleware) { ... }`
45
99
 
46
100
  ## Development
47
101
 
data/Rakefile CHANGED
@@ -1,6 +1,14 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
+ require 'github_changelog_generator/task'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
7
  task default: :spec
8
+
9
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
10
+ config.user = 'mvgijssel'
11
+ config.project = 'arel_toolkit'
12
+ config.future_release = "v#{ArelToolkit::VERSION}"
13
+ config.pulls = false
14
+ end
data/arel_toolkit.gemspec CHANGED
@@ -25,17 +25,23 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
 
27
27
  spec.add_dependency 'arel', '~> 9.0.0'
28
+ spec.add_dependency 'activerecord', '~> 5.2.0'
29
+ spec.add_dependency 'pg', '~> 1.1.4'
28
30
  spec.add_dependency 'pg_query', '~> 1.1.0'
29
31
 
30
32
  spec.add_development_dependency 'bundler', '~> 2.0'
33
+ spec.add_development_dependency 'dpl', '~> 1.10.11'
34
+ spec.add_development_dependency 'github_changelog_generator', '~> 1.14.3'
31
35
  spec.add_development_dependency 'rake', '~> 10.0'
32
36
  spec.add_development_dependency 'rspec', '~> 3.8'
37
+ spec.add_development_dependency 'database_cleaner', '~> 1.7.0'
33
38
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
34
39
  spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
35
40
 
36
41
  spec.add_development_dependency 'rubocop', '~> 0.69'
37
42
  spec.add_development_dependency 'guard', '~> 2.15'
38
43
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
44
+ spec.add_development_dependency 'guard-rubocop', '~> 1.3.0'
39
45
 
40
46
  spec.add_development_dependency 'pry'
41
47
  spec.add_development_dependency 'pry-nav'
data/bin/console CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'bundler/setup'
4
4
  require 'arel_toolkit'
5
+ require_relative '../spec/support/active_record'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -0,0 +1,22 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+ module Arel
4
+ module Visitors
5
+ class ToSql
6
+ def visit_Arel_Nodes_Assignment(o, collector)
7
+ collector = visit o.left, collector
8
+ collector << ' = '
9
+
10
+ case o.right
11
+ when Arel::Nodes::Node, Arel::Attributes::Attribute
12
+ visit o.right, collector
13
+ else
14
+ collector << quote(o.right).to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # rubocop:enable Naming/MethodName
22
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,30 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # https://www.postgresql.org/docs/9.2/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT
7
+ class AtTimeZone < Arel::Nodes::Unary
8
+ attr_reader :timezone
9
+
10
+ def initialize(expr, timezone)
11
+ super(expr)
12
+
13
+ @timezone = timezone
14
+ end
15
+ end
16
+ end
17
+
18
+ module Visitors
19
+ class ToSql
20
+ def visit_Arel_Nodes_AtTimeZone(o, collector)
21
+ visit o.expr, collector
22
+ collector << ' AT TIME ZONE '
23
+ visit o.timezone, collector
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # rubocop:enable Naming/MethodName
30
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.3/functions-net.html
4
+ class ContainedWithinEquals < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'<<=', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,9 @@
1
1
  module Arel
2
2
  module Nodes
3
3
  # https://www.postgresql.org/docs/9.1/functions-array.html
4
- class Contains < InfixOperation
4
+ class Contains < Arel::Nodes::InfixOperation
5
5
  def initialize(left, right)
6
- super('@>', left, right)
6
+ super(:'@>', left, right)
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.3/functions-net.html
4
+ class ContainsEquals < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'>>=', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ Arel::DeleteManager.class_eval do
2
+ def ==(other)
3
+ @ast == other.ast && @ctx == other.ctx
4
+ end
5
+
6
+ protected
7
+
8
+ attr_reader :ctx
9
+ end
@@ -8,6 +8,13 @@ module Arel
8
8
  attr_accessor :using
9
9
  attr_accessor :with
10
10
  attr_accessor :returning
11
+
12
+ alias_method :old_initialize, :initialize
13
+ def initialize(relation = nil, wheres = [])
14
+ old_initialize(relation, wheres)
15
+
16
+ @returning = []
17
+ end
11
18
  end
12
19
  end
13
20
 
@@ -1,22 +1,9 @@
1
- # rubocop:disable Naming/MethodName
2
- # rubocop:disable Naming/UncommunicativeMethodParamName
3
-
4
1
  module Arel
5
2
  module Nodes
6
- class DistinctFrom < Arel::Nodes::Binary
7
- end
8
- end
9
-
10
- module Visitors
11
- class ToSql
12
- def visit_Arel_Nodes_DistinctFrom(o, collector)
13
- visit o.left, collector
14
- collector << ' IS DISTINCT FROM '
15
- visit o.right, collector
3
+ class DistinctFrom < Arel::Nodes::InfixOperation
4
+ def initialize(left, right)
5
+ super(:'IS DISTINCT FROM', left, right)
16
6
  end
17
7
  end
18
8
  end
19
9
  end
20
-
21
- # rubocop:enable Naming/MethodName
22
- # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -6,15 +6,13 @@ module Arel
6
6
  class ToSql
7
7
  def visit_Arel_Nodes_Equality(o, collector)
8
8
  right = o.right
9
-
10
9
  collector = visit o.left, collector
11
10
 
12
- case right
13
- when Arel::Nodes::Unknown, Arel::Nodes::False, Arel::Nodes::True
11
+ if [Arel::Nodes::Unknown, Arel::Nodes::False, Arel::Nodes::True].include?(right.class)
14
12
  collector << ' IS '
15
13
  visit right, collector
16
14
 
17
- when NilClass
15
+ elsif right.nil?
18
16
  collector << ' IS NULL'
19
17
 
20
18
  else
@@ -0,0 +1,32 @@
1
+ # rubocop:disable Naming/MethodName
2
+ # rubocop:disable Naming/UncommunicativeMethodParamName
3
+
4
+ module Arel
5
+ module Nodes
6
+ # https://www.postgresql.org/docs/9.1/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
7
+ class ExtractFrom < Arel::Nodes::Unary
8
+ attr_reader :field
9
+
10
+ def initialize(expr, field)
11
+ super(expr)
12
+
13
+ @field = field
14
+ end
15
+ end
16
+ end
17
+
18
+ module Visitors
19
+ class ToSql
20
+ def visit_Arel_Nodes_ExtractFrom(o, collector)
21
+ collector << 'extract('
22
+ visit o.field, collector
23
+ collector << ' from '
24
+ visit o.expr, collector
25
+ collector << ')'
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ # rubocop:enable Naming/MethodName
32
+ # rubocop:enable Naming/UncommunicativeMethodParamName
@@ -0,0 +1,5 @@
1
+ Arel::InsertManager.class_eval do
2
+ def ==(other)
3
+ @ast == other.ast
4
+ end
5
+ end
@@ -6,9 +6,16 @@ module Arel
6
6
  # https://www.postgresql.org/docs/9.5/sql-insert.html
7
7
  Arel::Nodes::InsertStatement.class_eval do
8
8
  attr_accessor :with
9
- attr_accessor :on_conflict
9
+ attr_accessor :conflict
10
10
  attr_accessor :override
11
11
  attr_accessor :returning
12
+
13
+ alias_method :old_initialize, :initialize
14
+ def initialize
15
+ old_initialize
16
+
17
+ @returning = []
18
+ end
12
19
  end
13
20
  end
14
21
 
@@ -32,7 +39,7 @@ module Arel
32
39
  end
33
40
 
34
41
  case o.override
35
- when 0
42
+ when nil, 0
36
43
  collector << ''
37
44
  when 1
38
45
  collector << ' OVERRIDING USER VALUE'
@@ -55,7 +62,7 @@ module Arel
55
62
  collector = inject_join o.returning, collector, ', '
56
63
  end
57
64
 
58
- visit(o.on_conflict, collector) if o.on_conflict
65
+ visit(o.conflict, collector) if o.conflict
59
66
  collector
60
67
  end
61
68
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonGetField < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'->>', left, right)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Arel
2
+ module Nodes
3
+ # https://www.postgresql.org/docs/9.4/functions-json.html#FUNCTIONS-JSON-OP-TABLE
4
+ class JsonGetObject < Arel::Nodes::InfixOperation
5
+ def initialize(left, right)
6
+ super(:'->', left, right)
7
+ end
8
+ end
9
+ end
10
+ end