baby_squeel 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 630e302720d471b1ea0e6f618ef01e8592c0b9ab
4
- data.tar.gz: 621e74ac8ad305e143e856e1cee8a8c023b3ac9c
3
+ metadata.gz: bc084f58970dcb50513671717f743e024a391355
4
+ data.tar.gz: 1a4430236093f7554273c2a4357e0ad81879fe2d
5
5
  SHA512:
6
- metadata.gz: c91ddbf39dc8e7a153f9be6df8197ac7223d91d4bf003eb55049bb3c0d9f671e7aa4a810ddb122973e609f70e302db90011b1f82a9794133cd1d2f4f688d8d6c
7
- data.tar.gz: e71c24fb4bf300ae9806e4664e07c0e07e07cf74997f1259b2e6068fcb304f5d171bea6db2095d1e44a1329fe019f4a381be5e9686c6b9ec33d60b70b7787118
6
+ metadata.gz: fc821c6eaca9be86e6559a2c354b47125a8a6c549e6b1b4064bc6354baa7ff6ecf186ebe66141b05681f77656834b787dbce705786f5e785e67fd4df3b859df1
7
+ data.tar.gz: d9428e48fd5ce4b0d21b88c253616de212e7bda084e5af79888439f2f97180593757cb0a0fdf0efbdd3f952e97e9193412b201557580967802065cbf66b65d93
data/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ ## Unreleased
2
+
3
+ Nothing yet!
4
+
5
+ ## [0.2.2] - 2015-03-30
6
+ ### Added
7
+ - Support for `group` (`grouping`) and `having` (`when_having`).
8
+ - Support for sifters.
9
+ - Added `quoted` and `sql` helpers for quoting strings and SQL literals.
10
+ - More descriptive error messages when a column or association is not found.
11
+
12
+ ### Fixed
13
+ - `Arel::Nodes::Grouping` does not include `Arel::Math`, so operations like `(id + 5) + 3` would fail unexpectedly.
14
+ - Fix missing bind values When joining through associations with default scope.
15
+ - Removed `ActiveRecord::VERSION` specific handling of the `WhereChain`.
16
+
17
+ ## [0.2.1] - 2015-03-27
18
+ ### Added
19
+ - Support for subqueries.
20
+
21
+ ### Fixed
22
+ - Some Arel nodes did not have access to `as` expressions.
23
+
24
+ ## [0.2.0] - 2015-03-25
25
+ ### Added
26
+ - References to aliased joins in a `select`, `where`, or `order` expression now use the aliased table name.
27
+
28
+ ### Changed
29
+ - Rely on `ActiveRecord::Relation#join_sources` for the implicit construction of join nodes, rather than using the `ActiveRecord::Associations::JoinDependency` directly.
30
+
31
+ ### Fixed
32
+
33
+ - Associations referencing the same table weren't being aliased.
34
+
35
+ ## [0.1.0] - 2015-03-16
36
+ ### Added
37
+ - Initial support for selects, orders, wheres, and joins.
38
+
39
+ [Unreleased]: https://github.com/rzane/baby_squeel/compare/v0.2.2...HEAD
40
+ [0.2.1]: https://github.com/rzane/baby_squeel/compare/v0.2.1...v0.2.2
41
+ [0.2.1]: https://github.com/rzane/baby_squeel/compare/v0.2.0...v0.2.1
42
+ [0.2.0]: https://github.com/rzane/baby_squeel/compare/v0.1.0...v0.2.0
data/README.md CHANGED
@@ -28,6 +28,34 @@ Or install it yourself as:
28
28
 
29
29
  $ gem install baby_squeel
30
30
 
31
+ ## Introduction
32
+
33
+ With ActiveRecord, you might write something like this:
34
+
35
+ ```ruby
36
+ Post.where('created_at >= ?', 2.weeks.ago)
37
+ ```
38
+
39
+ But then someone tells you, "Hey, you should use Arel!". So you convert your query to use Arel:
40
+
41
+ ```ruby
42
+ Post.where(Post.arel_table[:created_at].gteq(2.weeks.ago))
43
+ ```
44
+
45
+ Well, that's great, but it's also pretty verbose. Why don't you give BabySqueel a try:
46
+
47
+ ```ruby
48
+ Post.where.has { created_at >= 2.weeks.ago }
49
+ ```
50
+
51
+ #### Quick note
52
+
53
+ BabySqueel's blocks use `instance_eval`, which means you won't have access to your instance variables or methods. Don't worry, there's a really easy solution. Just give arity to the block:
54
+
55
+ ```ruby
56
+ Post.where.has { |post| post.created_at >= 2.weeks.ago }
57
+ ```
58
+
31
59
  ## Usage
32
60
 
33
61
  Okay, so we have some models:
@@ -151,6 +179,15 @@ Post.joining { author.alias('a').on((author.id == author_id) | (author.name == t
151
179
  # INNER JOIN "authors" "a" ON ("authors"."id" = "posts"."author_id" OR "authors"."name" = "posts"."title")
152
180
  ```
153
181
 
182
+ ##### Grouping
183
+
184
+ ```ruby
185
+ Post.selecting { id.count }.grouping { author_id }.when_having { id.count > 5 }
186
+ # SELECT COUNT("posts"."id") FROM "posts"
187
+ # GROUP BY "posts"."author_id"
188
+ # HAVING (COUNT("posts"."id") > 5)
189
+ ```
190
+
154
191
  ##### Functions
155
192
 
156
193
  ```ruby
@@ -172,17 +209,53 @@ Post.joins(:author).where.has {
172
209
  # )
173
210
  ```
174
211
 
175
- ## Important Notes
212
+ ##### Custom SQL Operators
213
+
214
+ ```ruby
215
+ authors = Author.selecting { name.op('||', quoted('-dizzle')).as('swag') }
216
+ # SELECT "authors"."name" || '-dizzle' AS swag FROM "authors"
217
+
218
+ authors.first.swag #=> 'Ray Zane-dizzle'
219
+ ```
176
220
 
177
- While inside one of BabySqueel's blocks, `self` will be something totally different. You won't have access to your instance variables or methods.
221
+ ## Sifters
178
222
 
179
- Don't worry, there's an easy solution. Just give arity to the block:
223
+ Sifters are like little snippets of conditions that take parameters.
180
224
 
181
225
  ```ruby
182
- Post.where.has { |table| table.title == 'Test' }
183
- # SELECT "posts".* WHERE "posts"."title" = 'Test'
226
+ class Post < ActiveRecord::Base
227
+ sifter :funny do |str|
228
+ title == 'rabies'
229
+ end
230
+ end
231
+
232
+ class Author < ActiveRecord::Base
233
+ sifter :name_contains do |string|
234
+ name =~ "%#{string}%"
235
+ end
236
+ end
237
+
238
+ Post.joins(:author).where.has {
239
+ sift(:funny) | author.sift(:name_contains, 'blergh')
240
+ }
241
+ # SELECT "posts".* FROM "posts"
242
+ # INNER JOIN "authors" ON "authors"."id" = "posts"."author_id"
243
+ # WHERE ("posts"."title" = 'rabies' OR "authors"."name" LIKE '%blergh%')
184
244
  ```
185
245
 
246
+ ## What's what?
247
+
248
+ The following methods give you access to BabySqueel's DSL:
249
+
250
+ | BabySqueel | ActiveRecord Equivalent |
251
+ |---------------|-------------------------|
252
+ | `selecting` | `select` |
253
+ | `ordering` | `order` |
254
+ | `joining` | `joins` |
255
+ | `grouping` | `group` |
256
+ | `where.has` | `where` |
257
+ | `when_having` | `having` |
258
+
186
259
  ## Development
187
260
 
188
261
  1. Pick an ActiveRecord version to develop against, then export it: `export AR=4.2.6`.
data/baby_squeel.gemspec CHANGED
@@ -15,12 +15,9 @@ Gem::Specification.new do |spec|
15
15
  spec.license = 'MIT'
16
16
 
17
17
  spec.bindir = 'exe'
18
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
18
  spec.require_paths = ['lib']
20
19
 
21
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
22
- f.match(%r{^(test|spec|features)/})
23
- end
20
+ spec.files = Dir.glob('{lib/**/*,*.{md,txt,gemspec}}')
24
21
 
25
22
  spec.add_dependency 'activerecord', '>= 4.0.0'
26
23
 
data/lib/baby_squeel.rb CHANGED
@@ -6,6 +6,7 @@ require 'baby_squeel/active_record'
6
6
  module BabySqueel
7
7
  end
8
8
 
9
+ ::ActiveRecord::Base.extend BabySqueel::ActiveRecord::Sifting
9
10
  ::ActiveRecord::Base.extend BabySqueel::ActiveRecord::QueryMethods
10
11
  ::ActiveRecord::Relation.prepend BabySqueel::ActiveRecord::QueryMethods
11
12
  ::ActiveRecord::QueryMethods::WhereChain.prepend BabySqueel::ActiveRecord::WhereChain
@@ -2,10 +2,19 @@ require 'baby_squeel/dsl'
2
2
 
3
3
  module BabySqueel
4
4
  module ActiveRecord
5
+ module Sifting
6
+ def sifter(name, &block)
7
+ define_singleton_method "sift_#{name}" do |*args|
8
+ DSL.evaluate_sifter(self, *args, &block)
9
+ end
10
+ end
11
+ end
12
+
5
13
  module QueryMethods
6
14
  # Constructs Arel for ActiveRecord::Base#joins using the DSL.
7
15
  def joining(&block)
8
- joins DSL.evaluate(unscoped, &block)
16
+ arel, binds = DSL.evaluate_joins(unscoped, &block)
17
+ joins(arel).tap { |s| s.bind_values += binds }
9
18
  end
10
19
 
11
20
  # Constructs Arel for ActiveRecord::Base#select using the DSL.
@@ -17,23 +26,23 @@ module BabySqueel
17
26
  def ordering(&block)
18
27
  order DSL.evaluate(self, &block)
19
28
  end
29
+
30
+ # Constructs Arel for ActiveRecord::Base#group using the DSL.
31
+ def grouping(&block)
32
+ group DSL.evaluate(self, &block)
33
+ end
34
+
35
+ # Constructs Arel for ActiveRecord::Base#having using the DSL.
36
+ def when_having(&block)
37
+ having DSL.evaluate(self, &block)
38
+ end
20
39
  end
21
40
 
22
41
  module WhereChain
23
- if ::ActiveRecord::VERSION::MAJOR > 4
24
- # Constructs Arel for ActiveRecord::Base#where using the DSL.
25
- def has(&block)
26
- opts = DSL.evaluate(@scope, &block)
27
- factory = @scope.send(:where_clause_factory)
28
- @scope.where_clause += factory.build(opts, [])
29
- @scope
30
- end
31
- else
32
- # Constructs Arel for ActiveRecord::Base#where using the DSL.
33
- def has(&block)
34
- @scope.where_values += [DSL.evaluate(@scope, &block)]
35
- @scope
36
- end
42
+ # Constructs Arel for ActiveRecord::Base#where using the DSL.
43
+ def has(&block)
44
+ @scope.where! DSL.evaluate(@scope, &block)
45
+ @scope
37
46
  end
38
47
  end
39
48
  end
@@ -4,9 +4,33 @@ require 'baby_squeel/association'
4
4
 
5
5
  module BabySqueel
6
6
  class DSL < Table
7
- # Evaluates a block in the context of a new DSL instance.
8
- def self.evaluate(scope, &block)
9
- new(scope).evaluate(&block)
7
+ class << self
8
+ # Evaluates a block and unwraps the nodes
9
+ def evaluate(scope, &block)
10
+ Nodes.unwrap evaluate!(scope, &block)
11
+ end
12
+
13
+ # Evaluates a block in the context of a DSL instance
14
+ def evaluate!(scope, &block)
15
+ new(scope).evaluate(&block)
16
+ end
17
+
18
+ # Evaluates a block specifically for a join. In this
19
+ # case, we'll return an array of Arel join nodes and
20
+ # a list of bind parameters.
21
+ def evaluate_joins(scope, &block)
22
+ dependency = evaluate!(scope, &block)._arel
23
+ join_arel = Nodes.unwrap(dependency._arel)
24
+ [join_arel, dependency.bind_values]
25
+ end
26
+
27
+ # Evaluates a block in the context of a new DSL instance
28
+ # and passes all arguments to the block.
29
+ def evaluate_sifter(scope, *args, &block)
30
+ evaluate scope do |root|
31
+ root.instance_exec(*args, &block)
32
+ end
33
+ end
10
34
  end
11
35
 
12
36
  # Create a SQL function. See Arel::Nodes::NamedFunction.
@@ -24,13 +48,23 @@ module BabySqueel
24
48
  Nodes.wrap Arel::Nodes::NamedFunction.new(name.to_s, args)
25
49
  end
26
50
 
51
+ # See Arel::sql
52
+ def sql(value)
53
+ ::Arel.sql value
54
+ end
55
+
56
+ # Quotes a string and marks it as SQL
57
+ def quoted(value)
58
+ sql _scope.connection.quote(value)
59
+ end
60
+
27
61
  # Evaluates a DSL block. If arity is given, this method
28
62
  # `yield` itself, rather than `instance_eval`.
29
63
  def evaluate(&block)
30
64
  if block.arity.zero?
31
- Nodes.unwrap instance_eval(&block)
65
+ instance_eval(&block)
32
66
  else
33
- Nodes.unwrap yield(self)
67
+ yield(self)
34
68
  end
35
69
  end
36
70
 
@@ -1,31 +1,50 @@
1
1
  module BabySqueel
2
2
  class JoinDependency
3
- def initialize(scope, associations = [])
4
- @scope = scope
3
+ delegate :_scope, :_join, :_on, :_table, to: :@table
4
+
5
+ def initialize(table, associations = [])
6
+ @table = table
5
7
  @associations = associations
6
8
  end
7
9
 
10
+ if ActiveRecord::VERSION::STRING < '4.1.0'
11
+ def bind_values
12
+ _scope.joins(join_names(@associations)).bind_values
13
+ end
14
+ else
15
+ def bind_values
16
+ @bind_values ||= begin
17
+ relation = _scope.joins(join_names(@associations))
18
+ relation.arel.bind_values + relation.bind_values
19
+ end
20
+ end
21
+ end
22
+
8
23
  # Converts an array of BabySqueel::Associations into an array
9
24
  # of Arel join nodes.
10
25
  #
11
26
  # Each association is built individually so that the correct
12
27
  # Arel join node will be used for each individual association.
13
- def constraints
14
- @associations.each.with_index.inject([]) do |joins, (assoc, i)|
15
- inject @associations[0..i], joins, assoc._join
28
+ def _arel
29
+ if _on
30
+ [_join.new(_table, _on)]
31
+ else
32
+ @associations.each.with_index.inject([]) do |joins, (assoc, i)|
33
+ construct @associations[0..i], joins, assoc._join
34
+ end
16
35
  end
17
36
  end
18
37
 
19
38
  private
20
39
 
21
- def inject(associations, theirs, join_node)
40
+ def construct(associations, theirs, join_node)
22
41
  names = join_names associations
23
42
  mine = build names, join_node
24
43
  theirs + mine[theirs.length..-1]
25
44
  end
26
45
 
27
46
  def build(names, join_node)
28
- @scope.joins(names).join_sources.map do |join|
47
+ _scope.joins(names).join_sources.map do |join|
29
48
  join_node.new(join.left, join.right)
30
49
  end
31
50
  end
@@ -17,7 +17,7 @@ module BabySqueel
17
17
  # ActiveRecord.
18
18
  def unwrap(node)
19
19
  if node.respond_to? :_arel
20
- node._arel
20
+ unwrap node._arel
21
21
  elsif node.is_a? Array
22
22
  node.map { |n| unwrap(n) }
23
23
  else
@@ -60,13 +60,22 @@ module BabySqueel
60
60
  # include necessary/applicable modules.
61
61
  class Generic < Proxy
62
62
  extend Operators::ArelAliasing
63
- include Arel::AliasPredication
64
- include Arel::OrderPredications
65
63
  include Operators::Comparison
66
64
  include Operators::Equality
67
65
  include Operators::Generic
68
66
  include Operators::Grouping
69
67
  include Operators::Matching
68
+
69
+ # Extend the Arel node with some extra modules. For example,
70
+ # Arel::Nodes::Grouping does not implement Math. InfixOperation doesn't
71
+ # implement AliasPredication. Without these extensions, the interface
72
+ # just seems inconsistent.
73
+ def initialize(node)
74
+ node.extend Arel::Math
75
+ node.extend Arel::AliasPredication
76
+ node.extend Arel::OrderPredications
77
+ super(node)
78
+ end
70
79
  end
71
80
 
72
81
  class Attribute < Generic
@@ -85,7 +94,7 @@ module BabySqueel
85
94
  end
86
95
 
87
96
  def _arel
88
- parent_arel = @parent._arel
97
+ parent_arel = @parent._arel._arel
89
98
 
90
99
  if parent_arel && parent_arel.last
91
100
  parent_arel.last.left[@name]
@@ -42,7 +42,7 @@ module BabySqueel
42
42
  # * +other+ - The argument to be passed to the SQL operator.
43
43
  #
44
44
  # ==== Example
45
- # Post.select { title.op('||', 'diddly') }
45
+ # Post.select { title.op('||', quoted('diddly')) }
46
46
  # #=> SELECT "posts"."title" || 'diddly' FROM "posts"
47
47
  #
48
48
  def op(operator, other)
@@ -1,17 +1,23 @@
1
1
  require 'baby_squeel/join_dependency'
2
2
 
3
3
  module BabySqueel
4
+ class NotFoundError < StandardError
5
+ def initialize(model_name, name)
6
+ super "There is no column or association named '#{name}' for #{model_name}."
7
+ end
8
+ end
9
+
4
10
  class AssociationNotFoundError < StandardError
5
- def initialize(scope, name)
6
- super "Association named '#{name}' was not found on #{scope.model_name}"
11
+ def initialize(model_name, name)
12
+ super "Association named '#{name}' was not found for #{model_name}."
7
13
  end
8
14
  end
9
15
 
10
16
  class Table
11
- attr_accessor :_on, :_join, :_table
17
+ attr_accessor :_scope, :_on, :_join, :_table
12
18
 
13
19
  def initialize(scope)
14
- @scope = scope
20
+ @_scope = scope
15
21
  @_table = scope.arel_table
16
22
  @_join = Arel::Nodes::InnerJoin
17
23
  end
@@ -24,13 +30,17 @@ module BabySqueel
24
30
  # Constructs a new BabySqueel::Association. Raises
25
31
  # an exception if the association is not found.
26
32
  def association(name)
27
- if reflection = @scope.reflect_on_association(name)
33
+ if reflection = _scope.reflect_on_association(name)
28
34
  Association.new(self, reflection)
29
35
  else
30
- raise AssociationNotFoundError.new(@scope, name)
36
+ raise AssociationNotFoundError.new(_scope.model_name, name)
31
37
  end
32
38
  end
33
39
 
40
+ def sift(sifter_name, *args)
41
+ Nodes.wrap _scope.public_send("sift_#{sifter_name}", *args)
42
+ end
43
+
34
44
  # Alias a table. This is only possible when joining
35
45
  # an association explicitly.
36
46
  def alias(alias_name)
@@ -79,19 +89,15 @@ module BabySqueel
79
89
  # 2. Resolve the assocition's join clauses using ActiveRecord.
80
90
  #
81
91
  def _arel(associations = [])
82
- if _on
83
- _join.new(_table, _on)
84
- else
85
- JoinDependency.new(@scope, associations).constraints
86
- end
92
+ JoinDependency.new(self, associations)
87
93
  end
88
94
 
89
95
  private
90
96
 
91
97
  def resolve(name)
92
- if @scope.column_names.include?(name.to_s)
98
+ if _scope.column_names.include?(name.to_s)
93
99
  self[name]
94
- elsif @scope.reflect_on_association(name)
100
+ elsif _scope.reflect_on_association(name)
95
101
  association(name)
96
102
  end
97
103
  end
@@ -101,10 +107,10 @@ module BabySqueel
101
107
  end
102
108
 
103
109
  def method_missing(name, *args, &block)
104
- if !args.empty? || block_given?
105
- super
106
- else
107
- resolve(name) || super
110
+ return super if !args.empty? || block_given?
111
+
112
+ resolve(name) || begin
113
+ raise NotFoundError.new(_scope.model_name, name)
108
114
  end
109
115
  end
110
116
  end
@@ -1,3 +1,3 @@
1
1
  module BabySqueel
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '0.2.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: baby_squeel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ray Zane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-27 00:00:00.000000000 Z
11
+ date: 2016-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -87,16 +87,10 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
- - ".gitignore"
91
- - ".rspec"
92
- - ".travis.yml"
93
- - Gemfile
90
+ - CHANGELOG.md
94
91
  - LICENSE.txt
95
92
  - README.md
96
- - Rakefile
97
93
  - baby_squeel.gemspec
98
- - bin/console
99
- - bin/setup
100
94
  - lib/baby_squeel.rb
101
95
  - lib/baby_squeel/active_record.rb
102
96
  - lib/baby_squeel/association.rb
@@ -126,8 +120,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
120
  version: '0'
127
121
  requirements: []
128
122
  rubyforge_project:
129
- rubygems_version: 2.5.1
123
+ rubygems_version: 2.4.8
130
124
  signing_key:
131
125
  specification_version: 4
132
126
  summary: A tiny squeel implementation without all of the evil.
133
127
  test_files: []
128
+ has_rdoc:
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color
data/.travis.yml DELETED
@@ -1,19 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.2.4
5
-
6
- before_install: gem install bundler -v 1.11.2
7
- after_script: bundle exec rake coveralls:push
8
-
9
- env:
10
- global:
11
- - COVERALLS_REPO_TOKEN=X5ZWSPW8VW2JXNJO0qNjlZCQNW4ju89gb
12
- matrix:
13
- - AR=4.0.0
14
- - AR=4.1.0
15
- - AR=4.1.15
16
- - AR=4.2.0
17
- - AR=4.2.6
18
- - AR=5.0.0.beta2
19
- - AR=5.0.0.beta3
data/Gemfile DELETED
@@ -1,17 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in baby_squeel.gemspec
4
- gemspec
5
-
6
- if ar_version = ENV['AR']
7
- gem 'activerecord', ar_version
8
- else
9
- gem 'activerecord', github: 'rails/rails'
10
- end
11
-
12
- group :test do
13
- gem 'pry'
14
- gem 'coveralls'
15
- gem 'simplecov'
16
- end
17
-
data/Rakefile DELETED
@@ -1,41 +0,0 @@
1
- require 'yaml'
2
- require 'open3'
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
- require 'coveralls/rake/task'
6
-
7
- Coveralls::RakeTask.new
8
-
9
- RSpec::Core::RakeTask.new(:spec)
10
-
11
- def invoke(version, cmd)
12
- Bundler.with_clean_env do
13
- system({ 'AR' => version, 'SKIPCOV' => '1' }, cmd)
14
- end
15
- end
16
-
17
- desc 'Run against a specific ActiveRecord version'
18
- task 'spec:version', [:version] do |_, args|
19
- if args.version.nil? || args.version.empty?
20
- abort 'No version given'
21
- end
22
-
23
- FileUtils.rm_rf 'Gemfile.lock'
24
- invoke args.version, 'bundle install --quiet'
25
- invoke args.version, 'bundle exec rspec -f progress' if $?.success?
26
- $stderr.puts "#{args.version} failed." unless $?.success?
27
- end
28
-
29
- desc 'Run against all ActiveRecord versions'
30
- task 'spec:matrix' do
31
- travis = YAML.load_file '.travis.yml'
32
- spec_task = Rake::Task['spec:version']
33
-
34
- travis['env']['matrix'].each do |matrix|
35
- spec_task.invoke matrix[/\=(.+)$/, 1]
36
- spec_task.reenable
37
- puts "\n\n"
38
- end
39
- end
40
-
41
- task default: :spec
data/bin/console DELETED
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'bundler/setup'
4
- require 'baby_squeel'
5
- require_relative '../spec/support/schema'
6
- require_relative '../spec/support/models'
7
-
8
- # You can add fixtures and/or initialization code here to make experimenting
9
- # with your gem easier. You can also use a different console, if you like.
10
-
11
- puts 'Creating 2 authors...'
12
- authors = [
13
- Author.create!(name: 'Ray Zane'),
14
- Author.create!(name: 'Jimmy Hoffa')
15
- ]
16
-
17
- puts 'Creating 15 posts...'
18
- 15.times do |n|
19
- Post.create! title: "Post #{n}", author: authors.sample
20
- end
21
-
22
- ActiveRecord::Base.logger = Logger.new(STDOUT)
23
-
24
- require 'pry'
25
- Pry.start
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here