scope_chain 0.0.1 → 0.0.3

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.
data/README.md CHANGED
@@ -31,13 +31,43 @@ Using ScopeChain, you do:
31
31
 
32
32
  What this will do is setup some expectations that make sure those scope methods are called.
33
33
 
34
+ You can do "manual" scopes:
35
+
36
+ def manual_scopes
37
+ User.scoped.where("somethign = else")
38
+ end
39
+
40
+ it "does the right thing" do
41
+ ScopeChain.for(User).where("something = else")
42
+
43
+ manual_scopes
44
+ end
45
+
46
+ You can test return values:
47
+
48
+ def return_values
49
+ User.where("thing = 1")
50
+ end
51
+
52
+ it "returns properly" do
53
+ ScopeChain.for(User).where("thing = 1").returns(5)
54
+
55
+ return_values.should eq(5)
56
+ end
57
+
58
+
34
59
  Not in order, but called, which is something, right?
35
60
 
61
+ ## Known Issues
62
+
63
+ Uh, actual, user defined scopes don't work. Or if they do, I'd be surprised. And I'm sure I'm
64
+ missing a bunch of the ActiveRecord methods that are used.
65
+
36
66
  ## Installation
37
67
 
38
68
  Add this line to your application's Gemfile:
39
69
 
40
- gem 'scope-chain'
70
+ gem 'scope_chain'
41
71
 
42
72
  And then execute:
43
73
 
@@ -45,7 +75,7 @@ And then execute:
45
75
 
46
76
  Or install it yourself as:
47
77
 
48
- $ gem install scope-chain
78
+ $ gem install scope_chain
49
79
 
50
80
  ## Contributing
51
81
 
@@ -1,3 +1,3 @@
1
1
  module ScopeChain
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/scope_chain.rb CHANGED
@@ -8,28 +8,40 @@ module ScopeChain
8
8
  class Chain
9
9
  LINKS = [:select, :where, :includes, :order]
10
10
 
11
- attr_accessor :klass
11
+ attr_accessor :klass, :expectations
12
12
  def initialize(klass, &block)
13
13
  self.klass = klass
14
+ self.expectations = []
15
+ self.klass.stubs(scoped: klass) # Handle manual scope building
14
16
 
15
17
  yield self if block_given?
16
18
  end
17
19
 
18
20
  LINKS.each do |link|
19
- define_method(link) do |arguments = nil, returned = nil|
20
- add_link link, arguments, returned || klass
21
+ define_method(link) do |*arguments|
22
+ add_link link, *arguments
21
23
  end
22
24
  end
23
25
 
24
26
  def all(returned)
25
- add_link :all, nil, returned
27
+ add_link :all
28
+ returns returned
26
29
  end
27
-
30
+
31
+ def returns(object)
32
+ # DON'T LOOK
33
+ expectations.last.instance_variable_set(:@return_values, Mocha::ReturnValues.build(object))
34
+
35
+ self
36
+ end
37
+
28
38
  private
29
- def add_link(name, arguments = nil, returned = klass)
39
+ def add_link(name, *arguments)
30
40
  expectation = klass.expects(name)
31
- expectation.with(arguments) if arguments
32
- expectation.returns(returned)
41
+ expectation.with(*arguments) if arguments.size > 0
42
+ expectation.returns(klass)
43
+
44
+ expectations << expectation
33
45
 
34
46
  self
35
47
  end
data/scope_chain.gemspec CHANGED
@@ -20,4 +20,5 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'mocha'
21
21
 
22
22
  gem.add_development_dependency 'rspec'
23
+ gem.add_development_dependency 'activerecord', '~> 3.1.11'
23
24
  end
@@ -1,9 +1,14 @@
1
1
  lib = File.expand_path('../lib', __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
+ require 'active_record'
4
5
  require 'mocha/api'
5
6
  require 'scope_chain'
6
7
 
8
+ class Model < ActiveRecord::Base
9
+ scope :active, where("column = value")
10
+ end
11
+
7
12
  describe ScopeChain do
8
13
  let(:klass) { Class.new }
9
14
 
@@ -26,7 +31,7 @@ describe ScopeChain::Chain do
26
31
  end
27
32
 
28
33
  it "adds a link for #{link}" do
29
- subject.expects(:add_link).with(link, :arguments, klass)
34
+ subject.expects(:add_link).with(link, :arguments)
30
35
 
31
36
  subject.send(link, :arguments)
32
37
  end
@@ -37,29 +42,62 @@ describe ScopeChain::Chain do
37
42
  end
38
43
 
39
44
  it "adds a link for all" do
40
- subject.expects(:add_link).with(:all, nil, :boom)
45
+ subject.expects(:add_link).with(:all)
46
+ subject.expects(:returns).with(:boom)
41
47
 
42
48
  subject.all(:boom)
43
49
  end
44
50
 
51
+ it "supports manual scopes" do
52
+ subject.select("id")
53
+
54
+ klass.scoped.select("id")
55
+ end
56
+
57
+ describe "#returns" do
58
+ it "modifies the last expectation" do
59
+ subject.select("id").where("5").returns("9")
60
+
61
+ klass.select("id").where("5").should eq("9")
62
+ end
63
+ end
64
+
45
65
  describe "#add_link" do
46
66
  it "adds a basic expectation" do
47
67
  expectation = mock
48
- expectation.expects(:returns).with(:returned)
68
+ expectation.expects(:returns).with(klass)
49
69
 
50
70
  klass.expects(:expects).with(:name).returns(expectation)
51
71
 
52
- subject.send :add_link, :name, nil, :returned
72
+ subject.send :add_link, :name
53
73
  end
54
74
 
55
75
  it "adds an expectation with arguments" do
56
76
  expectation = mock
57
77
  expectation.expects(:with).with(:arguments)
58
- expectation.expects(:returns).with(:returned)
78
+ expectation.expects(:returns).with(klass)
59
79
 
60
80
  klass.expects(:expects).with(:name).returns(expectation)
61
81
 
62
- subject.send :add_link, :name, :arguments, :returned
82
+ subject.send :add_link, :name, :arguments
83
+ end
84
+ end
85
+
86
+ describe "with a custom scopes" do
87
+ it "fails properly" do
88
+ pending
89
+
90
+ ScopeChain.for(Model).where("column != value")
91
+
92
+ expect { Model.active.to_a }.to raise_error(Mocha::StubbingError)
93
+ end
94
+
95
+ it "passes properly" do
96
+ pending
97
+
98
+ ScopeChain.for(Model).where("column = value")
99
+
100
+ Model.active.to_a
63
101
  end
64
102
  end
65
103
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: scope_chain
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jon Moses
@@ -34,6 +34,17 @@ dependencies:
34
34
  version: "0"
35
35
  type: :development
36
36
  version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: activerecord
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.1.11
46
+ type: :development
47
+ version_requirements: *id003
37
48
  description: Easy testing of scope usage
38
49
  email:
39
50
  - jon@burningbush.us