convenient_scopes 0.9.1 → 0.10.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.
- data/Gemfile +8 -0
- data/Gemfile.lock +43 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/convenient_scopes.gemspec +28 -8
- data/lib/convenient_scopes.rb +45 -23
- data/test/helper.rb +3 -3
- metadata +112 -72
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activemodel (3.1.3)
|
5
|
+
activesupport (= 3.1.3)
|
6
|
+
builder (~> 3.0.0)
|
7
|
+
i18n (~> 0.6)
|
8
|
+
activerecord (3.1.3)
|
9
|
+
activemodel (= 3.1.3)
|
10
|
+
activesupport (= 3.1.3)
|
11
|
+
arel (~> 2.2.1)
|
12
|
+
tzinfo (~> 0.3.29)
|
13
|
+
activesupport (3.1.3)
|
14
|
+
multi_json (~> 1.0)
|
15
|
+
arel (2.2.3)
|
16
|
+
builder (3.0.0)
|
17
|
+
git (1.2.5)
|
18
|
+
i18n (0.6.0)
|
19
|
+
jeweler (1.8.3)
|
20
|
+
bundler (~> 1.0)
|
21
|
+
git (>= 1.2.5)
|
22
|
+
rake
|
23
|
+
rdoc
|
24
|
+
json (1.6.5)
|
25
|
+
multi_json (1.1.0)
|
26
|
+
rake (0.9.2.2)
|
27
|
+
rdoc (3.12)
|
28
|
+
json (~> 1.4)
|
29
|
+
shoulda (2.11.3)
|
30
|
+
sqlite3 (1.3.5)
|
31
|
+
test-unit (2.4.7)
|
32
|
+
tzinfo (0.3.31)
|
33
|
+
|
34
|
+
PLATFORMS
|
35
|
+
ruby
|
36
|
+
|
37
|
+
DEPENDENCIES
|
38
|
+
activerecord (= 3.1.3)
|
39
|
+
jeweler
|
40
|
+
rake
|
41
|
+
shoulda
|
42
|
+
sqlite3
|
43
|
+
test-unit
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
data/convenient_scopes.gemspec
CHANGED
@@ -4,20 +4,22 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "convenient_scopes"
|
8
|
+
s.version = "0.10.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ivan Schneider"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2012-02-23"
|
13
|
+
s.description = "Dynamic scopes by convention for ActiveRecord 3"
|
14
|
+
s.email = "isc@massivebraingames.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
21
23
|
"LICENSE",
|
22
24
|
"README.rdoc",
|
23
25
|
"Rakefile",
|
@@ -31,24 +33,42 @@ Gem::Specification.new do |s|
|
|
31
33
|
"test/test_ordering.rb",
|
32
34
|
"test/test_search_with_hash.rb"
|
33
35
|
]
|
34
|
-
s.homepage =
|
36
|
+
s.homepage = "http://github.com/isc/convenient_scopes"
|
35
37
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version =
|
37
|
-
s.summary =
|
38
|
+
s.rubygems_version = "1.8.17"
|
39
|
+
s.summary = "Dynamic scopes by convention for ActiveRecord 3"
|
38
40
|
|
39
41
|
if s.respond_to? :specification_version then
|
40
42
|
s.specification_version = 3
|
41
43
|
|
42
44
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
45
|
+
s.add_runtime_dependency(%q<test-unit>, [">= 0"])
|
46
|
+
s.add_runtime_dependency(%q<shoulda>, [">= 0"])
|
47
|
+
s.add_runtime_dependency(%q<activerecord>, ["= 3.1.3"])
|
48
|
+
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
50
|
+
s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
|
43
51
|
s.add_runtime_dependency(%q<activerecord>, [">= 3.0.4"])
|
44
52
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
45
53
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
46
54
|
else
|
55
|
+
s.add_dependency(%q<test-unit>, [">= 0"])
|
56
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
57
|
+
s.add_dependency(%q<activerecord>, ["= 3.1.3"])
|
58
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
59
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
60
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
47
61
|
s.add_dependency(%q<activerecord>, [">= 3.0.4"])
|
48
62
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
49
63
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
50
64
|
end
|
51
65
|
else
|
66
|
+
s.add_dependency(%q<test-unit>, [">= 0"])
|
67
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
68
|
+
s.add_dependency(%q<activerecord>, ["= 3.1.3"])
|
69
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
70
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
71
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
52
72
|
s.add_dependency(%q<activerecord>, [">= 3.0.4"])
|
53
73
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
54
74
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
data/lib/convenient_scopes.rb
CHANGED
@@ -1,7 +1,29 @@
|
|
1
1
|
module ConvenientScopes
|
2
|
+
|
3
|
+
def self.extended base
|
4
|
+
base.class_attribute :scopes
|
5
|
+
base.scopes = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def scope(name, scope_options = {})
|
9
|
+
name = name.to_sym
|
10
|
+
valid_scope_name?(name)
|
11
|
+
extension = Module.new(&Proc.new) if block_given?
|
12
|
+
|
13
|
+
scopes[name] = lambda do |*args|
|
14
|
+
options = scope_options.respond_to?(:call) ? scope_options.call(*args) : scope_options
|
15
|
+
options = scoped.apply_finder_options(options) if options.is_a?(Hash)
|
16
|
+
|
17
|
+
relation = scoped.merge(options)
|
2
18
|
|
3
|
-
|
4
|
-
|
19
|
+
extension ? relation.extending(extension) : relation
|
20
|
+
end
|
21
|
+
|
22
|
+
singleton_class.send(:redefine_method, name, &scopes[name])
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing name, *args, &block
|
26
|
+
if scope_data = (define_scope name, unscoped)
|
5
27
|
scope name, convert_to_scope_arg(scope_data)
|
6
28
|
send name, *args, &block
|
7
29
|
else
|
@@ -9,10 +31,10 @@ module ConvenientScopes
|
|
9
31
|
end
|
10
32
|
end
|
11
33
|
|
12
|
-
def define_scope name
|
34
|
+
def define_scope name, unscoped
|
13
35
|
(ScopeDefinitions.instance_methods.inject nil do |memo, scope_type|
|
14
|
-
memo ||= send scope_type.to_sym, name
|
15
|
-
end) || (association_scope name)
|
36
|
+
memo ||= send scope_type.to_sym, name, unscoped
|
37
|
+
end) || (association_scope name, unscoped)
|
16
38
|
end
|
17
39
|
|
18
40
|
def search search_scopes
|
@@ -32,12 +54,12 @@ module ConvenientScopes
|
|
32
54
|
ActiveRecord::Relation::ASSOCIATION_METHODS).include? name
|
33
55
|
end
|
34
56
|
|
35
|
-
def determine_order_scope_data name, direction
|
57
|
+
def determine_order_scope_data name, direction, unscoped
|
36
58
|
if column_names.include? name.to_s
|
37
59
|
unscoped.order("#{quoted_table_name}.#{name} #{direction}")
|
38
60
|
elsif assoc = (possible_association_for_scope name)
|
39
61
|
next_scope = extract_next_scope name, assoc
|
40
|
-
scope_arg = assoc.klass.determine_order_scope_data next_scope, direction
|
62
|
+
scope_arg = assoc.klass.determine_order_scope_data next_scope, direction, unscoped
|
41
63
|
scope_arg.is_a?(Array) ? [assoc.name] + scope_arg : [assoc.name, scope_arg] if scope_arg
|
42
64
|
end
|
43
65
|
end
|
@@ -75,49 +97,49 @@ module ConvenientScopes
|
|
75
97
|
[/^descend_by_/, 'desc']
|
76
98
|
]
|
77
99
|
|
78
|
-
def scopes_with_value name
|
100
|
+
def scopes_with_value name, unscoped
|
79
101
|
SCOPE_DEFINITIONS.inject nil do |memo, definition|
|
80
|
-
memo ||= match_and_define_scope name, *definition
|
102
|
+
memo ||= match_and_define_scope name, unscoped, *definition
|
81
103
|
end
|
82
104
|
end
|
83
105
|
|
84
|
-
def scopes_without_value name
|
106
|
+
def scopes_without_value name, unscoped
|
85
107
|
SCOPE_WITHOUT_VALUE_DEFINITIONS.inject nil do |memo, definition|
|
86
|
-
memo ||= match_and_define_scope_without_value name, *definition
|
108
|
+
memo ||= match_and_define_scope_without_value name, unscoped, *definition
|
87
109
|
end
|
88
110
|
end
|
89
111
|
|
90
|
-
def ordering_scopes name
|
112
|
+
def ordering_scopes name, unscoped
|
91
113
|
ORDERING_SCOPE_DEFINITIONS.inject nil do |memo, definition|
|
92
|
-
memo ||= match_ordering_scope name, *definition
|
114
|
+
memo ||= match_ordering_scope name, unscoped, *definition
|
93
115
|
end
|
94
116
|
end
|
95
117
|
|
96
|
-
def equals_scope name
|
118
|
+
def equals_scope name, unscoped
|
97
119
|
return unless (column = match_suffix_and_column_name name, %w(equals eq is))
|
98
|
-
lambda {|value| unscoped.where(column => value)}
|
120
|
+
lambda {|value| unscoped.where("#{table_name}.#{column}" => value)}
|
99
121
|
end
|
100
122
|
|
101
|
-
def boolean_column_scopes name
|
123
|
+
def boolean_column_scopes name, unscoped
|
102
124
|
str_name = name.to_s
|
103
125
|
value = !str_name.gsub!(/^not_/, '')
|
104
|
-
unscoped.where(str_name => value) if boolean_column? str_name
|
126
|
+
unscoped.where("#{table_name}.#{str_name}" => value) if boolean_column? str_name
|
105
127
|
end
|
106
128
|
|
107
129
|
end
|
108
130
|
|
109
131
|
include ScopeDefinitions
|
110
132
|
|
111
|
-
def match_ordering_scope name, prefix, direction
|
133
|
+
def match_ordering_scope name, unscoped, prefix, direction
|
112
134
|
str_name = name.to_s
|
113
135
|
return unless str_name.gsub!(prefix, '')
|
114
|
-
determine_order_scope_data str_name, direction
|
136
|
+
determine_order_scope_data str_name, direction, unscoped
|
115
137
|
end
|
116
138
|
|
117
|
-
def association_scope name
|
139
|
+
def association_scope name, unscoped
|
118
140
|
return unless assoc = (possible_association_for_scope name)
|
119
141
|
next_scope = extract_next_scope name, assoc
|
120
|
-
scope_arg = (assoc.klass.define_scope next_scope) || assoc.klass.scopes[next_scope]
|
142
|
+
scope_arg = (assoc.klass.define_scope next_scope, unscoped) || assoc.klass.scopes[next_scope]
|
121
143
|
scope_arg.is_a?(Array) ? [assoc.name] + scope_arg : [assoc.name, scope_arg] if scope_arg
|
122
144
|
end
|
123
145
|
|
@@ -129,13 +151,13 @@ module ConvenientScopes
|
|
129
151
|
name.to_s.split(/^#{assoc.name}_/).last.to_sym
|
130
152
|
end
|
131
153
|
|
132
|
-
def match_and_define_scope name, suffixes, sql_format, value_format = nil
|
154
|
+
def match_and_define_scope name, unscoped, suffixes, sql_format, value_format = nil
|
133
155
|
return unless (column = match_suffix_and_column_name name, suffixes)
|
134
156
|
sql = formatted_sql column, sql_format
|
135
157
|
lambda {|*value| unscoped.where([sql, value_format ? (value_format % value) : value].flatten) }
|
136
158
|
end
|
137
159
|
|
138
|
-
def match_and_define_scope_without_value name, suffixes, sql_format
|
160
|
+
def match_and_define_scope_without_value name, unscoped, suffixes, sql_format
|
139
161
|
return unless (column = match_suffix_and_column_name name, suffixes)
|
140
162
|
unscoped.where(formatted_sql column, sql_format)
|
141
163
|
end
|
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -1,78 +1,126 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: convenient_scopes
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.10.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 1
|
10
|
-
version: 0.9.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ivan Schneider
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
date: 2012-02-23 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: test-unit
|
16
|
+
requirement: &70172753587060 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70172753587060
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: shoulda
|
27
|
+
requirement: &70172753586480 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70172753586480
|
36
|
+
- !ruby/object:Gem::Dependency
|
22
37
|
name: activerecord
|
38
|
+
requirement: &70172753585880 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - =
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 3.1.3
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70172753585880
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: &70172753585360 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70172753585360
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: jeweler
|
60
|
+
requirement: &70172753584860 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
23
67
|
prerelease: false
|
24
|
-
|
68
|
+
version_requirements: *70172753584860
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: &70172753584240 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70172753584240
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: activerecord
|
82
|
+
requirement: &70172753575940 !ruby/object:Gem::Requirement
|
25
83
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 15
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
- 4
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
34
87
|
version: 3.0.4
|
35
88
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: shoulda
|
39
89
|
prerelease: false
|
40
|
-
|
90
|
+
version_requirements: *70172753575940
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: shoulda
|
93
|
+
requirement: &70172753575300 !ruby/object:Gem::Requirement
|
41
94
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 0
|
48
|
-
version: "0"
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
49
99
|
type: :development
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: sqlite3
|
53
100
|
prerelease: false
|
54
|
-
|
101
|
+
version_requirements: *70172753575300
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: sqlite3
|
104
|
+
requirement: &70172753574760 !ruby/object:Gem::Requirement
|
55
105
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
63
110
|
type: :development
|
64
|
-
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *70172753574760
|
65
113
|
description: Dynamic scopes by convention for ActiveRecord 3
|
66
114
|
email: isc@massivebraingames.com
|
67
115
|
executables: []
|
68
|
-
|
69
116
|
extensions: []
|
70
|
-
|
71
|
-
extra_rdoc_files:
|
117
|
+
extra_rdoc_files:
|
72
118
|
- LICENSE
|
73
119
|
- README.rdoc
|
74
|
-
files:
|
120
|
+
files:
|
75
121
|
- .document
|
122
|
+
- Gemfile
|
123
|
+
- Gemfile.lock
|
76
124
|
- LICENSE
|
77
125
|
- README.rdoc
|
78
126
|
- Rakefile
|
@@ -85,39 +133,31 @@ files:
|
|
85
133
|
- test/test_conditions.rb
|
86
134
|
- test/test_ordering.rb
|
87
135
|
- test/test_search_with_hash.rb
|
88
|
-
has_rdoc: true
|
89
136
|
homepage: http://github.com/isc/convenient_scopes
|
90
137
|
licenses: []
|
91
|
-
|
92
138
|
post_install_message:
|
93
139
|
rdoc_options: []
|
94
|
-
|
95
|
-
require_paths:
|
140
|
+
require_paths:
|
96
141
|
- lib
|
97
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
143
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
|
103
|
-
segments:
|
144
|
+
requirements:
|
145
|
+
- - ! '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
segments:
|
104
149
|
- 0
|
105
|
-
|
106
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
+
hash: -4207565202313100759
|
151
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
152
|
none: false
|
108
|
-
requirements:
|
109
|
-
- -
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
|
112
|
-
segments:
|
113
|
-
- 0
|
114
|
-
version: "0"
|
153
|
+
requirements:
|
154
|
+
- - ! '>='
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
115
157
|
requirements: []
|
116
|
-
|
117
158
|
rubyforge_project:
|
118
|
-
rubygems_version: 1.
|
159
|
+
rubygems_version: 1.8.17
|
119
160
|
signing_key:
|
120
161
|
specification_version: 3
|
121
162
|
summary: Dynamic scopes by convention for ActiveRecord 3
|
122
163
|
test_files: []
|
123
|
-
|