convenient_scopes 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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
-