arel_toolkit 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -0
  3. data/.gitignore +4 -1
  4. data/.rubocop.yml +13 -5
  5. data/.travis.yml +7 -2
  6. data/Appraisals +9 -0
  7. data/CHANGELOG.md +19 -0
  8. data/Gemfile +5 -0
  9. data/Gemfile.lock +22 -5
  10. data/README.md +59 -18
  11. data/arel_toolkit.gemspec +5 -1
  12. data/gemfiles/.bundle/config +2 -0
  13. data/gemfiles/arel_gems.gemfile +10 -0
  14. data/gemfiles/arel_gems.gemfile.lock +274 -0
  15. data/gemfiles/default.gemfile +5 -0
  16. data/gemfiles/default.gemfile.lock +198 -0
  17. data/lib/arel/enhance.rb +16 -0
  18. data/lib/arel/enhance/context_enhancer/arel_table.rb +75 -0
  19. data/lib/arel/enhance/node.rb +189 -0
  20. data/lib/arel/enhance/path.rb +38 -0
  21. data/lib/arel/enhance/path_node.rb +26 -0
  22. data/lib/arel/enhance/query.rb +36 -0
  23. data/lib/arel/enhance/visitor.rb +81 -0
  24. data/lib/arel/extensions.rb +24 -4
  25. data/lib/arel/extensions/active_record_type_caster_map.rb +7 -0
  26. data/lib/arel/extensions/array.rb +2 -9
  27. data/lib/arel/extensions/at_time_zone.rb +10 -3
  28. data/lib/arel/extensions/binary.rb +7 -0
  29. data/lib/arel/extensions/bit_string.rb +2 -9
  30. data/lib/arel/extensions/case.rb +17 -0
  31. data/lib/arel/extensions/conflict.rb +9 -0
  32. data/lib/arel/extensions/contains.rb +27 -5
  33. data/lib/arel/extensions/current_catalog.rb +4 -0
  34. data/lib/arel/extensions/current_date.rb +4 -0
  35. data/lib/arel/extensions/current_of_expression.rb +2 -9
  36. data/lib/arel/extensions/current_role.rb +4 -0
  37. data/lib/arel/extensions/current_row.rb +7 -0
  38. data/lib/arel/extensions/current_schema.rb +4 -0
  39. data/lib/arel/extensions/current_user.rb +4 -0
  40. data/lib/arel/extensions/dealocate.rb +31 -0
  41. data/lib/arel/extensions/default_values.rb +4 -0
  42. data/lib/arel/extensions/delete_manager.rb +22 -6
  43. data/lib/arel/extensions/delete_statement.rb +26 -9
  44. data/lib/arel/extensions/dot.rb +11 -0
  45. data/lib/arel/extensions/extract_from.rb +3 -10
  46. data/lib/arel/extensions/factorial.rb +10 -2
  47. data/lib/arel/extensions/false.rb +7 -0
  48. data/lib/arel/extensions/function.rb +42 -13
  49. data/lib/arel/extensions/indirection.rb +3 -12
  50. data/lib/arel/extensions/infer.rb +6 -6
  51. data/lib/arel/extensions/infix_operation.rb +17 -0
  52. data/lib/arel/extensions/insert_manager.rb +19 -3
  53. data/lib/arel/extensions/insert_statement.rb +30 -11
  54. data/lib/arel/extensions/into.rb +21 -0
  55. data/lib/arel/extensions/named_argument.rb +3 -8
  56. data/lib/arel/extensions/named_function.rb +7 -0
  57. data/lib/arel/extensions/ordering.rb +21 -6
  58. data/lib/arel/extensions/overlaps.rb +9 -0
  59. data/lib/arel/extensions/overlay.rb +9 -0
  60. data/lib/arel/extensions/position.rb +3 -8
  61. data/lib/arel/extensions/prepare.rb +39 -0
  62. data/lib/arel/extensions/row.rb +3 -8
  63. data/lib/arel/extensions/select_core.rb +58 -0
  64. data/lib/arel/extensions/select_manager.rb +22 -6
  65. data/lib/arel/extensions/select_statement.rb +31 -9
  66. data/lib/arel/extensions/session_user.rb +4 -0
  67. data/lib/arel/extensions/set_to_default.rb +4 -0
  68. data/lib/arel/extensions/substring.rb +8 -0
  69. data/lib/arel/extensions/table.rb +43 -10
  70. data/lib/arel/extensions/time_with_precision.rb +6 -0
  71. data/lib/arel/extensions/to_sql.rb +27 -0
  72. data/lib/arel/extensions/transaction.rb +3 -8
  73. data/lib/arel/extensions/tree_manager.rb +10 -0
  74. data/lib/arel/extensions/trim.rb +8 -0
  75. data/lib/arel/extensions/true.rb +7 -0
  76. data/lib/arel/extensions/type_cast.rb +7 -0
  77. data/lib/arel/extensions/unary.rb +7 -0
  78. data/lib/arel/extensions/unary_operation.rb +16 -0
  79. data/lib/arel/extensions/unknown.rb +4 -0
  80. data/lib/arel/extensions/update_manager.rb +22 -6
  81. data/lib/arel/extensions/update_statement.rb +27 -10
  82. data/lib/arel/extensions/user.rb +4 -0
  83. data/lib/arel/extensions/values_list.rb +15 -0
  84. data/lib/arel/extensions/variable_set.rb +9 -0
  85. data/lib/arel/extensions/variable_show.rb +3 -8
  86. data/lib/arel/middleware/chain.rb +1 -5
  87. data/lib/arel/middleware/railtie.rb +10 -0
  88. data/lib/arel/sql_to_arel.rb +6 -3
  89. data/lib/arel/sql_to_arel/pg_query_visitor.rb +43 -15
  90. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +1 -1
  91. data/lib/arel/sql_to_arel/result.rb +0 -4
  92. data/lib/arel/transformer.rb +7 -0
  93. data/lib/arel/transformer/add_schema_to_table.rb +26 -0
  94. data/lib/arel/transformer/remove_active_record_info.rb +42 -0
  95. data/lib/arel_toolkit.rb +8 -1
  96. data/lib/arel_toolkit/version.rb +1 -1
  97. metadata +81 -8
  98. data/lib/arel/extensions/unbound_column_reference.rb +0 -5
  99. data/lib/arel/sql_formatter.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12a7a7083cd421854ed6034a0a1cbf83352439d843d7414225267599e9d5a0af
4
- data.tar.gz: db2a316896694e49edce2ee52aab4f2283781e45347acaea23fac1fd5dbbf5a9
3
+ metadata.gz: 5e147a210e33300231d9f47c66eb56d961ffa83c9b3e22744427270e2188c6c2
4
+ data.tar.gz: 5fdba0c675a031f44eed13f217520da94f8f3f347198c3bdfdf92786622f01f0
5
5
  SHA512:
6
- metadata.gz: 1b77b18061a8332e5e6aa9fe0288fb2526309604f17eb3751d0c363ea1349aaa158fad5106fee32e0a3064cbc21615e1930dd0e59012b92648e75a96cc488190
7
- data.tar.gz: 5b04edcfc25b94cb44ac93d4c7472bc7e4d380c20a1d750c41f56e52b754cb0e023b5758e8c35dd2477037e6ff9ca0d2b0aaf5dc7825063fa5b053be7142c142
6
+ metadata.gz: db6d5427ffd51079b8652ad706d5e265889d996dda889b22e28ca84296310ab4a2517a63b3cfa7105bfbba745eaf9bc12947261f91acfe250005b94edf0f1912
7
+ data.tar.gz: 785dbd44ba4008a3cae7ef3d51d53afe7b048c9877a574853a9e2dbf63992474dfd4f3be40c0b3d50573ec290072414addcfee59d942449a622b98a7ceb3de43
data/.codeclimate.yml CHANGED
@@ -2,6 +2,9 @@ version: "2"
2
2
  plugins:
3
3
  rubocop:
4
4
  enabled: true
5
+ channel: rubocop-0-71
6
+ config:
7
+ file: .rubocop.yml
5
8
  bundler-audit:
6
9
  enabled: true
7
10
  fixme:
data/.gitignore CHANGED
@@ -10,7 +10,10 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
 
13
+ # approvals gem
14
+ .approvals
15
+
13
16
  *.temp
14
17
  # emacs
15
18
  TAGS
16
- .#*
19
+ .#*
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
- Style/FrozenStringLiteralComment:
2
- Enabled: false
1
+ AllCops:
2
+ Exclude:
3
+ - 'gemfiles/arel_gems.gemfile'
4
+ - 'gemfiles/default.gemfile'
3
5
 
4
6
  Bundler/OrderedGems:
5
7
  Enabled: false
@@ -7,9 +9,6 @@ Bundler/OrderedGems:
7
9
  Gemspec/OrderedDependencies:
8
10
  Enabled: false
9
11
 
10
- Style/MultilineBlockChain:
11
- Enabled: false
12
-
13
12
  Metrics/LineLength:
14
13
  Enabled: true
15
14
  Max: 100
@@ -26,12 +25,21 @@ Metrics/BlockLength:
26
25
  Style/Documentation:
27
26
  Enabled: false
28
27
 
28
+ Style/MultilineBlockChain:
29
+ Enabled: false
30
+
31
+ Style/TrailingCommaInHashLiteral:
32
+ EnforcedStyleForMultiline: comma
33
+
29
34
  Style/TrailingCommaInArrayLiteral:
30
35
  EnforcedStyleForMultiline: comma
31
36
 
32
37
  Style/TrailingCommaInArguments:
33
38
  EnforcedStyleForMultiline: comma
34
39
 
40
+ Style/FrozenStringLiteralComment:
41
+ Enabled: false
42
+
35
43
  Layout/MultilineMethodCallIndentation:
36
44
  Enabled: true
37
45
  EnforcedStyle: indented
data/.travis.yml CHANGED
@@ -9,14 +9,19 @@ notifications:
9
9
  email: false
10
10
  rvm:
11
11
  - 2.5.3
12
+ addons:
13
+ postgresql: "9.5"
12
14
  before_script:
13
15
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
14
16
  - chmod +x ./cc-test-reporter
15
17
  - ./cc-test-reporter before-build
16
18
  before_install:
17
- - gem install bundler -v 2.0.1
19
+ - GEM_HOME=vendor/bundle/ruby/2.5.0 gem install bundler -v 2.0.1
20
+ install:
21
+ - GEM_HOME=vendor/bundle/ruby/2.5.0 bundle install --jobs=3 --retry=3 --deployment --path=${BUNDLE_PATH:-vendor/bundle}
22
+ - GEM_HOME=vendor/bundle/ruby/2.5.0 bundle exec appraisal install
18
23
  script:
19
- - bundle exec rspec spec
24
+ - GEM_HOME=vendor/bundle/ruby/2.5.0 bundle exec appraisal rspec
20
25
  after_script:
21
26
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
22
27
  deploy:
data/Appraisals ADDED
@@ -0,0 +1,9 @@
1
+ appraise 'arel_gems' do
2
+ gem 'postgres_ext', github: 'Hacker0x01/postgres_ext', branch: 'rails-5.2'
3
+ gem 'active_record_upsert', github: 'Hacker0x01/active_record_upsert', branch: 'master'
4
+ gem 'pg_search', github: 'Hacker0x01/pg_search', branch: 'update-ranking'
5
+ gem 'rspec-rails', '~> 3.8.0'
6
+ end
7
+
8
+ appraise 'default' do
9
+ end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.4.0](https://github.com/mvgijssel/arel_toolkit/tree/v0.4.0) (2019-07-31)
4
+ [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.3.0...v0.4.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Rename Arel.transformer to Arel.enhance [\#111](https://github.com/mvgijssel/arel_toolkit/issues/111)
9
+ - Ability to query an Arel transformer tree [\#103](https://github.com/mvgijssel/arel_toolkit/issues/103)
10
+ - Implement PREPARE and DEALLOCATE statement [\#101](https://github.com/mvgijssel/arel_toolkit/issues/101)
11
+ - Replace Arel::Nodes::UnboundColumnReference with Arel::Nodes::UnqualifiedColumn [\#91](https://github.com/mvgijssel/arel_toolkit/issues/91)
12
+ - Create Arel transformer class to safely and easily mutate an Arel AST [\#89](https://github.com/mvgijssel/arel_toolkit/issues/89)
13
+ - Test and verify compatibility with Arel extension gems [\#81](https://github.com/mvgijssel/arel_toolkit/issues/81)
14
+ - Automatically load Railtie when gem is included in Rails [\#66](https://github.com/mvgijssel/arel_toolkit/issues/66)
15
+ - Create remove ActiveRecord specifics transformer [\#63](https://github.com/mvgijssel/arel_toolkit/issues/63)
16
+ - Add brakeman to check for security vulnerabilities [\#10](https://github.com/mvgijssel/arel_toolkit/issues/10)
17
+
18
+ **Fixed bugs:**
19
+
20
+ - TypeError: superclass mismatch for class Overlap [\#93](https://github.com/mvgijssel/arel_toolkit/issues/93)
21
+
3
22
  ## [v0.3.0](https://github.com/mvgijssel/arel_toolkit/tree/v0.3.0) (2019-07-01)
4
23
  [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.2.0...v0.3.0)
5
24
 
data/Gemfile CHANGED
@@ -1,4 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
3
8
  # Specify your gem's dependencies in arel_toolkit.gemspec
4
9
  gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arel_toolkit (0.3.0)
4
+ arel_toolkit (0.4.0)
5
5
  activerecord (~> 5.2.0)
6
6
  arel (~> 9.0.0)
7
7
  pg (~> 1.1.4)
@@ -24,6 +24,13 @@ GEM
24
24
  addressable (2.6.0)
25
25
  public_suffix (>= 2.0.2, < 4.0)
26
26
  ansi (1.5.0)
27
+ appraisal (2.2.0)
28
+ bundler
29
+ rake
30
+ thor (>= 0.14.0)
31
+ approvals (0.0.24)
32
+ nokogiri (~> 1.6)
33
+ thor (~> 0.18)
27
34
  arel (9.0.0)
28
35
  ast (2.4.0)
29
36
  binding_of_caller (0.8.0)
@@ -70,7 +77,7 @@ GEM
70
77
  i18n (1.6.0)
71
78
  concurrent-ruby (~> 1.0)
72
79
  interception (0.5)
73
- jaro_winkler (1.5.2)
80
+ jaro_winkler (1.5.3)
74
81
  json (2.2.0)
75
82
  listen (3.1.5)
76
83
  rb-fsevent (~> 0.9, >= 0.9.4)
@@ -78,10 +85,13 @@ GEM
78
85
  ruby_dep (~> 1.2)
79
86
  lumberjack (1.0.13)
80
87
  method_source (0.9.2)
88
+ mini_portile2 (2.4.0)
81
89
  minitest (5.11.3)
82
90
  multi_json (1.13.1)
83
91
  multipart-post (2.1.1)
84
92
  nenv (0.3.0)
93
+ nokogiri (1.10.3)
94
+ mini_portile2 (~> 2.4.0)
85
95
  notiffany (0.1.1)
86
96
  nenv (~> 0.1)
87
97
  shellany (~> 0.0)
@@ -98,6 +108,9 @@ GEM
98
108
  pry-alias (0.0.1)
99
109
  binding_of_caller
100
110
  pry
111
+ pry-doc (1.0.0)
112
+ pry (~> 0.11)
113
+ yard (~> 0.9.11)
101
114
  pry-nav (0.3.0)
102
115
  pry (>= 0.9.10, < 0.13.0)
103
116
  pry-rescue (1.5.0)
@@ -126,14 +139,14 @@ GEM
126
139
  diff-lcs (>= 1.2.0, < 2.0)
127
140
  rspec-support (~> 3.8.0)
128
141
  rspec-support (3.8.0)
129
- rubocop (0.69.0)
142
+ rubocop (0.71.0)
130
143
  jaro_winkler (~> 1.5.1)
131
144
  parallel (~> 1.10)
132
145
  parser (>= 2.6)
133
146
  rainbow (>= 2.2.2, < 4.0)
134
147
  ruby-progressbar (~> 1.7)
135
148
  unicode-display_width (>= 1.4.0, < 1.7)
136
- ruby-progressbar (1.10.0)
149
+ ruby-progressbar (1.10.1)
137
150
  ruby_dep (1.5.0)
138
151
  sawyer (0.8.2)
139
152
  addressable (>= 2.3.5)
@@ -153,11 +166,14 @@ GEM
153
166
  tzinfo (1.2.5)
154
167
  thread_safe (~> 0.1)
155
168
  unicode-display_width (1.6.0)
169
+ yard (0.9.20)
156
170
 
157
171
  PLATFORMS
158
172
  ruby
159
173
 
160
174
  DEPENDENCIES
175
+ appraisal (~> 2.2.0)
176
+ approvals (~> 0.0.24)
161
177
  arel_toolkit!
162
178
  bundler (~> 2.0)
163
179
  database_cleaner (~> 1.7.0)
@@ -168,12 +184,13 @@ DEPENDENCIES
168
184
  guard-rubocop (~> 1.3.0)
169
185
  pry
170
186
  pry-alias
187
+ pry-doc
171
188
  pry-nav
172
189
  pry-rescue
173
190
  pry-stack_explorer
174
191
  rake (~> 10.0)
175
192
  rspec (~> 3.8)
176
- rubocop (~> 0.69)
193
+ rubocop (= 0.71.0)
177
194
  simplecov (~> 0.16.1)
178
195
  simplecov-console (~> 0.4.2)
179
196
 
data/README.md CHANGED
@@ -27,7 +27,7 @@ Or install it yourself as:
27
27
 
28
28
  $ gem install arel_toolkit
29
29
 
30
- ## sql_to_arel
30
+ ## Sql to Arel
31
31
 
32
32
  Convert your (PostgreSQL) SQL into an Arel AST.
33
33
 
@@ -40,29 +40,66 @@ Convert your (PostgreSQL) SQL into an Arel AST.
40
40
  => "SELECT \"id\" FROM \"users\""
41
41
  ```
42
42
 
43
- ## Extensions
43
+ ## Enhanced Arel AST
44
+
45
+ `Arel.enhance(arel)` adds additional information and helper methods to the existing Arel AST. This allows for mutating the AST, adding contextual information to the AST and querying for nodes. Some examples:
46
+
47
+ ##### Query for Arel nodes with certain properties
48
+ ```ruby
49
+ arel = Post.select(:id, :public).where(id: 1).arel
50
+ enhanced_arel = Arel.enhance(arel)
51
+ enhanced_arel.query(class: Arel::Table).each { ... }
52
+ ```
53
+
54
+ ##### Query for Arel nodes with an enhanced context
55
+ An `Arel::Table` is used in multiple different places inside the AST, and those locations will give the `Arel::Table` a different meaning. Used within a projection (_column_reference_) like `SELECT posts.id` has a different meaning than within a from `SELECT * FROM posts` (_range_variable_). The following example results in `Arel::Table` nodes where the object is used in the context of referencing a column:
56
+
57
+ ```ruby
58
+ enhanced_arel.query(class: Arel::Table, context: { column_reference: true }).each { ... }
59
+ ```
60
+
61
+ ##### Get an Arel node at a certain path
62
+ ```ruby
63
+ enhanced_arel.child_at_path(['ast', 'cores', 0, 'projections', 1]).object
64
+ => #<struct Arel::Attributes::Attribute>
65
+ ```
66
+
67
+ ##### Replace or remove nodes without modifying the original arel
68
+ `remove` and `replace` allow for modifications to the Arel AST. The changes are aplied to a new copy of the AST, making sure the original AST is not touched.
69
+
70
+ ```ruby
71
+ enhanced_arel.child_at_path(['ast', 'cores', 0, 'projections', 1]).replace(Post.arel_table[:content])
72
+ enhanced_arel.child_at_path(['ast', 'cores', 0, 'projections', 0]).remove
73
+ enhanced_arel.to_sql
74
+ => SELECT "posts"."content" FROM "posts" WHERE "posts"."id" = $1
75
+ ```
44
76
 
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
77
 
47
78
  ## Middleware
48
79
 
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`.
80
+ Creating Arel from SQL and enhancing Arel is just the beginning, where this gem really shines is the ability to modify Arel ASTs using middleware.
50
81
 
51
- ### Example
82
+ Middleware sits between ActiveRecord and the database, it allows you to alter the Arel (the SQL query) before it's send to the database. Multiple middlewares are supported by passing the results from a finished middleware to the next. Next to the arel object, a context object is used that acts as a intermediate storage between middlewares.
52
83
 
53
- Create an initializer in Rails which loads the Arel::Middleware **after** ActiveRecord:
84
+ The middleware works out of the box in combination with Rails. If using ActiveRecord standalone you need to run the following **after** setting up the database connection:
54
85
 
55
86
  ```ruby
56
- ActiveSupport.on_load :active_record do
57
- Arel::Middleware::Railtie.insert_postgresql
58
- end
87
+ Arel::Middleware::Railtie.insert_postgresql
59
88
  ```
60
89
 
61
- Create some middleware (can be any Ruby object which responds to `call`):
90
+ ### Example
91
+
92
+ Create some middleware (this can be any Ruby object as long as it responds to `call`). In this example, we're creating a middleware that will reorder any query. Next to reordering, we're adding an additional middleware that prints out the result of the reorder middleware.
62
93
 
63
94
  ```ruby
64
95
  class ReorderMiddleware
65
96
  def self.call(arel, _context)
97
+ enhanced_arel = Arel.enhance(arel)
98
+ enhanced_arel.query(class: Arel::Nodes::SelectStatement).each do |node|
99
+ arel_table = node.child_at_path(['cores', 0, 'source', 'left']).object
100
+ node['orders'].replace([arel_table[:id].asc])
101
+ end
102
+
66
103
  arel.order(Post.arel_table[:id].asc)
67
104
  end
68
105
  end
@@ -72,24 +109,24 @@ class LoggingMiddleware
72
109
  puts "User executing query: `#{context[:current_user_id]}`"
73
110
  puts "Original SQL: `#{context[:original_sql]}`"
74
111
  puts "Modified SQL: `#{arel.to_sql}`"
112
+
75
113
  arel
76
114
  end
77
115
  end
78
116
  ```
79
117
 
80
- Run a query with middleware applied
118
+ Now that we've defined our middelwares, it's time to see them in action:
81
119
 
82
120
  ```ruby
83
121
  [1] > Arel.middleware.apply([ReorderMiddleware, LoggingMiddleware]).context(current_user_id: 1) { Post.all.load }
84
122
  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
123
+ Original SQL: `SELECT "posts".* FROM "posts"`
124
+ Modified SQL: `SELECT "posts".* FROM "posts" ORDER BY "posts"."id" ASC`
125
+ Post Load (4.1ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" ASC
88
126
  => []
89
127
  ```
90
128
 
91
- There are more methods available to help with ordering and modifying of the current applied middleware:
92
-
129
+ This gem ships with a couple of middelware methods that allow you to fine-tune what and when to apply middelware.
93
130
  - `Arel.middleware.apply([SomeMiddleware]) { ... }`
94
131
  - `Arel.middleware.only([OnlyMe]) { ... }`
95
132
  - `Arel.middleware.none { ... }`
@@ -97,6 +134,10 @@ There are more methods available to help with ordering and modifying of the curr
97
134
  - `Arel.middleware.insert_before(RunBefore, ThisMiddleware) { ... }`
98
135
  - `Arel.middleware.insert_after(RunAfter, ThisMiddleware) { ... }`
99
136
 
137
+ ## Extensions
138
+
139
+ This gem aims to have full support for PostgreSQL's SQL. In order to do so, it needs to add missing Arel nodes and extends the existing visitors. A full list of extensions on Arel can be found here: [lib/arel/extensions](https://github.com/mvgijssel/arel_toolkit/tree/master/lib/arel/extensions).
140
+
100
141
  ## Development
101
142
 
102
143
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -105,7 +146,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
105
146
 
106
147
  ## Contributing
107
148
 
108
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/arel_toolkit. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
149
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mvgijssel/arel_toolkit. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
109
150
 
110
151
  ## License
111
152
 
@@ -113,4 +154,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
113
154
 
114
155
  ## Code of Conduct
115
156
 
116
- Everyone interacting in the ArelToolkit project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/arel_toolkit/blob/master/CODE_OF_CONDUCT.md).
157
+ Everyone interacting in the ArelToolkit project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/mvgijssel/arel_toolkit/blob/master/CODE_OF_CONDUCT.md).
data/arel_toolkit.gemspec CHANGED
@@ -34,17 +34,21 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'github_changelog_generator', '~> 1.14.3'
35
35
  spec.add_development_dependency 'rake', '~> 10.0'
36
36
  spec.add_development_dependency 'rspec', '~> 3.8'
37
+ spec.add_development_dependency 'approvals', '~> 0.0.24'
38
+ spec.add_development_dependency 'appraisal', '~> 2.2.0'
37
39
  spec.add_development_dependency 'database_cleaner', '~> 1.7.0'
38
40
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
39
41
  spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
40
42
 
41
- spec.add_development_dependency 'rubocop', '~> 0.69'
43
+ # When updating also update .codeclimate.yml:5
44
+ spec.add_development_dependency 'rubocop', '= 0.71.0'
42
45
  spec.add_development_dependency 'guard', '~> 2.15'
43
46
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
44
47
  spec.add_development_dependency 'guard-rubocop', '~> 1.3.0'
45
48
 
46
49
  spec.add_development_dependency 'pry'
47
50
  spec.add_development_dependency 'pry-nav'
51
+ spec.add_development_dependency 'pry-doc'
48
52
  spec.add_development_dependency 'pry-rescue'
49
53
  spec.add_development_dependency 'pry-stack_explorer'
50
54
  spec.add_development_dependency 'pry-alias'
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "postgres_ext", branch: "rails-5.2", git: "https://github.com/Hacker0x01/postgres_ext.git"
6
+ gem "active_record_upsert", branch: "master", git: "https://github.com/Hacker0x01/active_record_upsert.git"
7
+ gem "pg_search", branch: "update-ranking", git: "https://github.com/Hacker0x01/pg_search.git"
8
+ gem "rspec-rails", "~> 3.8.0"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,274 @@
1
+ GIT
2
+ remote: https://github.com/Hacker0x01/active_record_upsert.git
3
+ revision: 7aa8a57431e817e53e68097c4a83b53dfe6d7c8e
4
+ branch: master
5
+ specs:
6
+ active_record_upsert (0.9.1)
7
+ activerecord (>= 5.0, < 6.0)
8
+ arel (> 7.0, < 10.0)
9
+ pg (>= 0.18, < 2.0)
10
+
11
+ GIT
12
+ remote: https://github.com/Hacker0x01/pg_search.git
13
+ revision: 2185dc3cb1b1cf251153b0d4e9ab468a0b64a212
14
+ branch: update-ranking
15
+ specs:
16
+ pg_search (2.1.2)
17
+ activerecord (>= 4.2)
18
+ activesupport (>= 4.2)
19
+ arel (>= 6)
20
+
21
+ GIT
22
+ remote: https://github.com/Hacker0x01/postgres_ext.git
23
+ revision: 0df6a2891a3bad7da1e7d06e5b6d4e10a3219eb4
24
+ branch: rails-5.2
25
+ specs:
26
+ postgres_ext (3.0.0)
27
+ activerecord (>= 4.0.0)
28
+ arel (>= 4.0.1)
29
+ pg_array_parser (~> 0.0.9)
30
+
31
+ PATH
32
+ remote: ..
33
+ specs:
34
+ arel_toolkit (0.4.0)
35
+ activerecord (~> 5.2.0)
36
+ arel (~> 9.0.0)
37
+ pg (~> 1.1.4)
38
+ pg_query (~> 1.1.0)
39
+
40
+ GEM
41
+ remote: https://rubygems.org/
42
+ specs:
43
+ actionpack (5.2.3)
44
+ actionview (= 5.2.3)
45
+ activesupport (= 5.2.3)
46
+ rack (~> 2.0)
47
+ rack-test (>= 0.6.3)
48
+ rails-dom-testing (~> 2.0)
49
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
50
+ actionview (5.2.3)
51
+ activesupport (= 5.2.3)
52
+ builder (~> 3.1)
53
+ erubi (~> 1.4)
54
+ rails-dom-testing (~> 2.0)
55
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
56
+ activemodel (5.2.3)
57
+ activesupport (= 5.2.3)
58
+ activerecord (5.2.3)
59
+ activemodel (= 5.2.3)
60
+ activesupport (= 5.2.3)
61
+ arel (>= 9.0)
62
+ activesupport (5.2.3)
63
+ concurrent-ruby (~> 1.0, >= 1.0.2)
64
+ i18n (>= 0.7, < 2)
65
+ minitest (~> 5.1)
66
+ tzinfo (~> 1.1)
67
+ addressable (2.6.0)
68
+ public_suffix (>= 2.0.2, < 4.0)
69
+ ansi (1.5.0)
70
+ appraisal (2.2.0)
71
+ bundler
72
+ rake
73
+ thor (>= 0.14.0)
74
+ approvals (0.0.24)
75
+ nokogiri (~> 1.6)
76
+ thor (~> 0.18)
77
+ arel (9.0.0)
78
+ ast (2.4.0)
79
+ binding_of_caller (0.8.0)
80
+ debug_inspector (>= 0.0.1)
81
+ builder (3.2.3)
82
+ coderay (1.1.2)
83
+ concurrent-ruby (1.1.5)
84
+ crass (1.0.4)
85
+ database_cleaner (1.7.0)
86
+ debug_inspector (0.0.3)
87
+ diff-lcs (1.3)
88
+ docile (1.3.2)
89
+ dpl (1.10.12)
90
+ erubi (1.8.0)
91
+ faraday (0.15.4)
92
+ multipart-post (>= 1.2, < 3)
93
+ faraday-http-cache (2.0.0)
94
+ faraday (~> 0.8)
95
+ ffi (1.11.1)
96
+ formatador (0.2.5)
97
+ github_changelog_generator (1.14.3)
98
+ activesupport
99
+ faraday-http-cache
100
+ multi_json
101
+ octokit (~> 4.6)
102
+ rainbow (>= 2.1)
103
+ rake (>= 10.0)
104
+ retriable (~> 2.1)
105
+ guard (2.15.0)
106
+ formatador (>= 0.2.4)
107
+ listen (>= 2.7, < 4.0)
108
+ lumberjack (>= 1.0.12, < 2.0)
109
+ nenv (~> 0.1)
110
+ notiffany (~> 0.0)
111
+ pry (>= 0.9.12)
112
+ shellany (~> 0.0)
113
+ thor (>= 0.18.1)
114
+ guard-compat (1.2.1)
115
+ guard-rspec (4.7.3)
116
+ guard (~> 2.1)
117
+ guard-compat (~> 1.1)
118
+ rspec (>= 2.99.0, < 4.0)
119
+ guard-rubocop (1.3.0)
120
+ guard (~> 2.0)
121
+ rubocop (~> 0.20)
122
+ hirb (0.7.3)
123
+ i18n (1.6.0)
124
+ concurrent-ruby (~> 1.0)
125
+ interception (0.5)
126
+ jaro_winkler (1.5.3)
127
+ json (2.2.0)
128
+ listen (3.1.5)
129
+ rb-fsevent (~> 0.9, >= 0.9.4)
130
+ rb-inotify (~> 0.9, >= 0.9.7)
131
+ ruby_dep (~> 1.2)
132
+ loofah (2.2.3)
133
+ crass (~> 1.0.2)
134
+ nokogiri (>= 1.5.9)
135
+ lumberjack (1.0.13)
136
+ method_source (0.9.2)
137
+ mini_portile2 (2.4.0)
138
+ minitest (5.11.3)
139
+ multi_json (1.13.1)
140
+ multipart-post (2.1.1)
141
+ nenv (0.3.0)
142
+ nokogiri (1.10.3)
143
+ mini_portile2 (~> 2.4.0)
144
+ notiffany (0.1.1)
145
+ nenv (~> 0.1)
146
+ shellany (~> 0.0)
147
+ octokit (4.14.0)
148
+ sawyer (~> 0.8.0, >= 0.5.3)
149
+ parallel (1.17.0)
150
+ parser (2.6.3.0)
151
+ ast (~> 2.4.0)
152
+ pg (1.1.4)
153
+ pg_array_parser (0.0.9)
154
+ pg_query (1.1.0)
155
+ pry (0.12.2)
156
+ coderay (~> 1.1.0)
157
+ method_source (~> 0.9.0)
158
+ pry-alias (0.0.1)
159
+ binding_of_caller
160
+ pry
161
+ pry-doc (1.0.0)
162
+ pry (~> 0.11)
163
+ yard (~> 0.9.11)
164
+ pry-nav (0.3.0)
165
+ pry (>= 0.9.10, < 0.13.0)
166
+ pry-rescue (1.5.0)
167
+ interception (>= 0.5)
168
+ pry (>= 0.12.0)
169
+ pry-stack_explorer (0.4.9.3)
170
+ binding_of_caller (>= 0.7)
171
+ pry (>= 0.9.11)
172
+ public_suffix (3.1.1)
173
+ rack (2.0.7)
174
+ rack-test (1.1.0)
175
+ rack (>= 1.0, < 3)
176
+ rails-dom-testing (2.0.3)
177
+ activesupport (>= 4.2.0)
178
+ nokogiri (>= 1.6)
179
+ rails-html-sanitizer (1.0.4)
180
+ loofah (~> 2.2, >= 2.2.2)
181
+ railties (5.2.3)
182
+ actionpack (= 5.2.3)
183
+ activesupport (= 5.2.3)
184
+ method_source
185
+ rake (>= 0.8.7)
186
+ thor (>= 0.19.0, < 2.0)
187
+ rainbow (3.0.0)
188
+ rake (10.5.0)
189
+ rb-fsevent (0.10.3)
190
+ rb-inotify (0.10.0)
191
+ ffi (~> 1.0)
192
+ retriable (2.1.0)
193
+ rspec (3.8.0)
194
+ rspec-core (~> 3.8.0)
195
+ rspec-expectations (~> 3.8.0)
196
+ rspec-mocks (~> 3.8.0)
197
+ rspec-core (3.8.2)
198
+ rspec-support (~> 3.8.0)
199
+ rspec-expectations (3.8.4)
200
+ diff-lcs (>= 1.2.0, < 2.0)
201
+ rspec-support (~> 3.8.0)
202
+ rspec-mocks (3.8.1)
203
+ diff-lcs (>= 1.2.0, < 2.0)
204
+ rspec-support (~> 3.8.0)
205
+ rspec-rails (3.8.2)
206
+ actionpack (>= 3.0)
207
+ activesupport (>= 3.0)
208
+ railties (>= 3.0)
209
+ rspec-core (~> 3.8.0)
210
+ rspec-expectations (~> 3.8.0)
211
+ rspec-mocks (~> 3.8.0)
212
+ rspec-support (~> 3.8.0)
213
+ rspec-support (3.8.2)
214
+ rubocop (0.71.0)
215
+ jaro_winkler (~> 1.5.1)
216
+ parallel (~> 1.10)
217
+ parser (>= 2.6)
218
+ rainbow (>= 2.2.2, < 4.0)
219
+ ruby-progressbar (~> 1.7)
220
+ unicode-display_width (>= 1.4.0, < 1.7)
221
+ ruby-progressbar (1.10.1)
222
+ ruby_dep (1.5.0)
223
+ sawyer (0.8.2)
224
+ addressable (>= 2.3.5)
225
+ faraday (> 0.8, < 2.0)
226
+ shellany (0.0.1)
227
+ simplecov (0.16.1)
228
+ docile (~> 1.1)
229
+ json (>= 1.8, < 3)
230
+ simplecov-html (~> 0.10.0)
231
+ simplecov-console (0.4.2)
232
+ ansi
233
+ hirb
234
+ simplecov
235
+ simplecov-html (0.10.2)
236
+ thor (0.20.3)
237
+ thread_safe (0.3.6)
238
+ tzinfo (1.2.5)
239
+ thread_safe (~> 0.1)
240
+ unicode-display_width (1.6.0)
241
+ yard (0.9.20)
242
+
243
+ PLATFORMS
244
+ ruby
245
+
246
+ DEPENDENCIES
247
+ active_record_upsert!
248
+ appraisal (~> 2.2.0)
249
+ approvals (~> 0.0.24)
250
+ arel_toolkit!
251
+ bundler (~> 2.0)
252
+ database_cleaner (~> 1.7.0)
253
+ dpl (~> 1.10.11)
254
+ github_changelog_generator (~> 1.14.3)
255
+ guard (~> 2.15)
256
+ guard-rspec (~> 4.7)
257
+ guard-rubocop (~> 1.3.0)
258
+ pg_search!
259
+ postgres_ext!
260
+ pry
261
+ pry-alias
262
+ pry-doc
263
+ pry-nav
264
+ pry-rescue
265
+ pry-stack_explorer
266
+ rake (~> 10.0)
267
+ rspec (~> 3.8)
268
+ rspec-rails (~> 3.8.0)
269
+ rubocop (= 0.71.0)
270
+ simplecov (~> 0.16.1)
271
+ simplecov-console (~> 0.4.2)
272
+
273
+ BUNDLED WITH
274
+ 2.0.1