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 ADDED
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem 'test-unit', :require => 'test/unit'
4
+ gem 'shoulda'
5
+ gem 'activerecord', '3.1.3', :require => 'active_record'
6
+ gem 'rake'
7
+ gem 'jeweler'
8
+ gem 'sqlite3'
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
@@ -40,7 +40,7 @@ rescue LoadError
40
40
  end
41
41
  end
42
42
 
43
- task :test => :check_dependencies
43
+ # task :test => :check_dependencies
44
44
 
45
45
  task :default => :test
46
46
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1
1
+ 0.10.0
@@ -4,20 +4,22 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{convenient_scopes}
8
- s.version = "0.9.1"
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 = %q{2011-09-28}
13
- s.description = %q{Dynamic scopes by convention for ActiveRecord 3}
14
- s.email = %q{isc@massivebraingames.com}
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 = %q{http://github.com/isc/convenient_scopes}
36
+ s.homepage = "http://github.com/isc/convenient_scopes"
35
37
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.5.2}
37
- s.summary = %q{Dynamic scopes by convention for ActiveRecord 3}
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"])
@@ -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
- def method_missing(name, *args, &block)
4
- if scope_data = (define_scope name)
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
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
- require 'test/unit'
3
- require 'shoulda'
4
- require 'active_record'
2
+ require 'bundler'
3
+ require 'logger'
4
+ Bundler.require
5
5
 
6
6
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
7
  $LOAD_PATH.unshift(File.dirname(__FILE__))
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
- hash: 57
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
- date: 2011-09-28 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
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
- requirement: &id001 !ruby/object:Gem::Requirement
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- hash: 3
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
63
110
  type: :development
64
- version_requirements: *id003
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
- hash: 3
103
- segments:
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ segments:
104
149
  - 0
105
- version: "0"
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
- hash: 3
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.5.2
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
-