scopable 1.1.0 → 1.1.1

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: db1ac9caa504b39e2c3bd583a410c40cbe822c5a
4
- data.tar.gz: a06474713343b047e5bd2b3004fe356a6c19d0f2
3
+ metadata.gz: 8489a22edabcb084113a419241d84225a8f054e4
4
+ data.tar.gz: 4ec1c76ec10aaa7fbd19f5394700d354489bb8e1
5
5
  SHA512:
6
- metadata.gz: 8e90dc92efeed46a6def9c9ed3efe173e998f37618283d8fd2a2113eb2e1af6a7d74dbf65373e2a41b25817f68b6c3ca17f65296eb8b9e3a6bd498f4f633d4c8
7
- data.tar.gz: f28f405579fe0e12c3dcde190e9fc3d1951e4ef1eb65277c9da13e054fa0b52e1fce7fc5efe4e11ee5037153434e54ee51a8d3e04885e19a125188482995f65d
6
+ metadata.gz: 12ccb068f7e55bafd9d517f8ae620e5dc6121c61950eb704699231510fc5abd9c88ac014bb3ce071f7557c89edad07f08efdd0c9a4bda5c3b8bf518aea36a12c
7
+ data.tar.gz: 82ca0836921ed85397ba15108e3e5bb0844926902b9f9e458cc066cef57e2b4836fe402e9bde69332311e072a3bfacd4acb68130b666303d6a23a0df1149c487
@@ -7,48 +7,48 @@ module Scopable
7
7
 
8
8
  def scoped(model, params)
9
9
  scopes.reduce(model) do |relation, scope|
10
- name, scope = *scope
10
+ name, options = *scope
11
11
 
12
12
  # Controller actions where this scope should be applied.
13
13
  # Accepts either a literal value or a lambda. nil with disable the option.
14
- only = scope[:only]
14
+ only = options[:only]
15
15
  only = instance_exec(&only) if only.respond_to?(:call)
16
16
 
17
17
  # Enfore :only option.
18
- break relation unless only.nil? || Array.wrap(only).map(&:to_s).include?(action_name)
18
+ next relation unless only.nil? || Array.wrap(only).map(&:to_s).include?(action_name)
19
19
 
20
20
  # Controller actions where this scope should be ignored.
21
21
  # Accepts either a literal value or a lambda. nil with disable the option.
22
- except = scope[:except]
22
+ except = options[:except]
23
23
  except = instance_exec(&except) if except.respond_to?(:call)
24
24
 
25
25
  # Enfore :except option.
26
- break relation if except.present? && Array.wrap(except).map(&:to_s).include?(action_name)
26
+ next relation if except.present? && Array.wrap(except).map(&:to_s).include?(action_name)
27
27
 
28
28
  # Name of the request parameters which value will be used in this scope.
29
29
  # Defaults to the name of the scope.
30
- param = scope.fetch(:param, name)
30
+ param = options.fetch(:param, name)
31
31
 
32
32
  # Use the value from the request parameter or fall back to the default.
33
33
  value = params[param]
34
34
 
35
35
  # If parameter is not present use the :default option.
36
36
  # Accepts either a literal value or a lambda.
37
- value = scope[:default] if value.nil?
37
+ value = options[:default] if value.nil?
38
38
 
39
39
  # Forces the scope to use the given value given in the :force option.
40
40
  # Accepts either a literal value or a lambda.
41
- value = scope[:force] if scope.key?(:force)
41
+ value = options[:force] if options.key?(:force)
42
42
 
43
43
  # If either :default or :force options were procs, evaluate them.
44
44
  value = instance_exec(&value) if value.respond_to?(:call)
45
45
 
46
46
  # The :required option makes sure there's a value present, otherwise return an empty scope (Model#none).
47
- required = scope[:required]
47
+ required = options[:required]
48
48
  required = instance_exec(&required) if required.respond_to?(:call)
49
49
 
50
50
  # Enforce the :required option.
51
- return relation.none if required && value.nil?
51
+ break relation.none if required && value.nil?
52
52
 
53
53
  # Parses values like 'on/off', 'true/false', and 'yes/no' to an actual boolean value.
54
54
  case value.to_s
@@ -61,10 +61,10 @@ module Scopable
61
61
  # For advanced scopes that require more than a method call on the model.
62
62
  # When a block is given, it is ran no matter the scope value.
63
63
  # The proc will be given the model being scoped and the resulting value from the options above, and it'll be executed inside the context of the controller's action.
64
- block = scope[:block]
64
+ block = options[:block]
65
65
 
66
66
  if block.nil? && value.nil?
67
- break relation
67
+ next relation
68
68
  end
69
69
 
70
70
  case
@@ -1,3 +1,3 @@
1
1
  module Scopable
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
@@ -51,43 +51,54 @@ describe Scopable do
51
51
  #
52
52
  # Test two optional scopes, with 0, 1, and 2 matching parameters.
53
53
  #
54
- describe 'with two optional scope' do
54
+ describe 'with two optional scopes' do
55
55
  let :controller do
56
56
  Class.new(Controller) do
57
- scope :search
58
- scope :page
57
+ scope :color
58
+ scope :size
59
59
  end
60
60
  end
61
61
 
62
- context 'with no matching parameters' do
62
+ context 'without parameters' do
63
63
  subject :action do
64
64
  controller.new
65
65
  end
66
66
 
67
- it 'should skip the scope' do
67
+ it 'should skip the scopes' do
68
68
  expect(action.relation.scopes).to be_empty
69
69
  end
70
70
  end
71
71
 
72
- context 'with one matching parameter' do
72
+ context 'with parameter matching the first scope' do
73
73
  subject :action do
74
- controller.new(nil, search: 'test')
74
+ controller.new(nil, color: 'black')
75
75
  end
76
76
 
77
- it 'should apply one of the scopes' do
77
+ it 'should apply only the first scope' do
78
78
  expect(action.relation.scopes.size).to eq(1)
79
- expect(action.relation.scopes).to include(search: 'test')
79
+ expect(action.relation.scopes).to include(color: 'black')
80
+ end
81
+ end
82
+
83
+ context 'with parameter matching the second scope' do
84
+ subject :action do
85
+ controller.new(nil, size: 'm')
86
+ end
87
+
88
+ it 'should apply only the second scope' do
89
+ expect(action.relation.scopes.size).to eq(1)
90
+ expect(action.relation.scopes).to include(size: 'm')
80
91
  end
81
92
  end
82
93
 
83
- context 'with two matching parameters' do
94
+ context 'with parameters matching both scopes' do
84
95
  subject :action do
85
- controller.new(nil, search: 'test', page: 2)
96
+ controller.new(nil, size: 'm', color: 'black')
86
97
  end
87
98
 
88
99
  it 'should apply both scopes' do
89
100
  expect(action.relation.scopes.size).to eq(2)
90
- expect(action.relation.scopes).to include(search: 'test', page: 2)
101
+ expect(action.relation.scopes).to include(size: 'm', color: 'black')
91
102
  end
92
103
  end
93
104
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scopable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Corenzan
@@ -14,56 +14,56 @@ dependencies:
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description:
@@ -73,11 +73,11 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - .codeclimate.yml
77
- - .gitignore
78
- - .rspec
79
- - .rubocop.yml
80
- - .travis.yml
76
+ - ".codeclimate.yml"
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".rubocop.yml"
80
+ - ".travis.yml"
81
81
  - Gemfile
82
82
  - LICENSE.txt
83
83
  - README.md
@@ -99,17 +99,17 @@ require_paths:
99
99
  - lib
100
100
  required_ruby_version: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  required_rubygems_version: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - '>='
107
+ - - ">="
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
110
  requirements: []
111
111
  rubyforge_project:
112
- rubygems_version: 2.0.14.1
112
+ rubygems_version: 2.6.8
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: Apply or skip model scopes based on options and request parameters.