basic_named_scopes 0.1.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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/README.rdoc ADDED
@@ -0,0 +1,81 @@
1
+ = BasicNamedScopes
2
+
3
+ Basic named scopes for ActiveRecord. Propagates the parameters of the
4
+ find-method as named scopes, for easy reusability and prettier code.
5
+
6
+ Instead of writing:
7
+
8
+ Post.all(:conditions => { :published => true }, :select => :title, :includes => :author)
9
+
10
+ You can now write:
11
+
12
+ Post.conditions(:published => true).select(:title).include(:author)
13
+
14
+ Reuse them by making class methods:
15
+
16
+ class Post < ActiveRecord::Base
17
+
18
+ def self.published
19
+ conditions(:published => true)
20
+ end
21
+
22
+ def self.visible
23
+ conditions(:visible => true)
24
+ end
25
+
26
+ def self.index
27
+ published.visible
28
+ end
29
+
30
+ end
31
+
32
+ Also, the +all+-method is a named scope now, so you can chain after callling
33
+ all, for greater flexibility.
34
+
35
+ Post.all.published
36
+
37
+ Arrays can be used as multple parameters too, sparing you some brackets.
38
+
39
+ Post.include(:author, :comments).conditions("name LIKE ?", query)
40
+
41
+ The +read_only+ and +lock+ scopes default to true, but can be adjusted.
42
+
43
+ Post.readonly # => same as Post.all(:readonly => true)
44
+ Post.readonly(false) # => same as Post.all(:readonly => false)
45
+
46
+ == Why?
47
+
48
+ NamedScopes are really handy and they should play a more central theme in ActiveRecord.
49
+ While I heard that ActiveRecord 3 will support similar syntax, there is no reason to wait
50
+ any longer.
51
+
52
+ I find defining named scopes very ugly, especially when dealing with parameters.
53
+ Just compare the amount of curly braces!
54
+
55
+ # Using normal named scope:
56
+ named_scope :name_like, lambda { |query| { :conditions => ["name LIKE ?", query] } }
57
+
58
+ # Using BasicNamedScopes
59
+ def self.name_like(query)
60
+ conditions("name LIKE ?", query)
61
+ end
62
+
63
+ Also, regular named scopes don't support using other named scopes at all!
64
+
65
+ I found myself implementing (mostly conditions, but others too) so often, that
66
+ a little gem like this would be the obvious choice. Use it if a gem like
67
+ searchlogic is overkill for your needs.
68
+
69
+ == Installing
70
+
71
+ The gem is called "basic_named_scopes". You know how to install it.
72
+
73
+ gem install basic_named_scopes
74
+
75
+ Use it in Rails:
76
+
77
+ config.gem "basic_named_scopes"
78
+
79
+ == Copyright
80
+
81
+ Copyright (c) 2009 Iain Hecker. Released under the MIT License.
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "basic_named_scopes"
8
+ gem.summary = %Q{Basic named scopes for ActiveRecord makes all find-parameters a named scope}
9
+ gem.description = %Q{Make your queries prettier and more reusable by having a named scope for every find-parameter. As easy as Post.include(:author, :comments)}
10
+ gem.email = "iain@iain.nl"
11
+ gem.homepage = "http://github.com/iain/basic_named_scopes"
12
+ gem.authors = ["Iain Hecker"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_development_dependency "temping", ">= 1.1.0"
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+ task :spec => :check_dependencies
34
+
35
+ task :default => :spec
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = "basic_named_scopes #{version}"
43
+ rdoc.rdoc_files.include('README*')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,63 @@
1
+ # Basic named scopes for ActiveRecord. Propagates the parameters of the
2
+ # find-method as named scopes, for easy reusability and prettier code.
3
+ #
4
+ # Instead of writing:
5
+ #
6
+ # Post.all(:conditions => { :published => true }, :select => :title, :includes => :author)
7
+ #
8
+ # You can now write:
9
+ #
10
+ # Post.conditions(:published => true).select(:title).include(:author)
11
+ #
12
+ # Reuse them by making class methods:
13
+ #
14
+ # class Post < ActiveRecord::Base
15
+ #
16
+ # def self.published
17
+ # conditions(:published => true)
18
+ # end
19
+ #
20
+ # def self.visible
21
+ # conditions(:visible => true)
22
+ # end
23
+ #
24
+ # def self.index
25
+ # published.visible
26
+ # end
27
+ #
28
+ # end
29
+ #
30
+ # Also, the +all+-method is a named scope now, so you can chain after callling
31
+ # all, for greater flexibility.
32
+ #
33
+ # Post.all.published
34
+ #
35
+ # Arrays can be used as multple parameters too, sparing you some brackets.
36
+ #
37
+ # Post.include(:author, :comments).conditions("name LIKE ?", query)
38
+ #
39
+ # The +read_only+ and +lock+ scopes default to true, but can be adjusted.
40
+ #
41
+ # Post.readonly # => same as Post.all(:readonly => true)
42
+ # Post.readonly(false) # => same as Post.all(:readonly => false)
43
+ #
44
+ module BasicNamedScopes
45
+
46
+ FIND_PARAMETERS = [:conditions, :order, :group, :having, :limit, :offset, :joins, :include, :select, :from]
47
+ FIND_BOOLEAN_SWITCHES = [:readonly, :lock]
48
+
49
+ def self.extended(record)
50
+ FIND_PARAMETERS.each do |parameter|
51
+ record.named_scope(parameter, lambda { |*args| { parameter => args.size == 1 ? args.first : args } })
52
+ end
53
+ FIND_BOOLEAN_SWITCHES.each do |parameter|
54
+ record.named_scope(parameter, lambda { |*args| { parameter => args.size == 0 ? true : args[0] } })
55
+ end
56
+ record.named_scope(:all, lambda { |*args| args[0] || {} })
57
+ end
58
+
59
+ end
60
+
61
+ if defined? ActiveRecord
62
+ ActiveRecord::Base.extend(BasicNamedScopes)
63
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "BasicNamedScopes" do
4
+
5
+ before :all do
6
+ create_model :posts do
7
+ with_columns do |table|
8
+ table.boolean :published
9
+ table.boolean :visible
10
+ end
11
+ extend BasicNamedScopes
12
+ end
13
+ end
14
+
15
+ before :each do
16
+ Post.delete_all
17
+ @published = Post.create!(:published => true)
18
+ @unpublished = Post.create!(:published => false)
19
+ end
20
+
21
+ it "should make .all a named scope" do
22
+ # Without parameters
23
+ Post.all.class.should be_scope
24
+ # With parameters
25
+ Post.all(:conditions => {:published => true}).class.should be_scope
26
+ end
27
+
28
+ it "should make find parameters a named scope" do
29
+ subject = Post.conditions(:published => true)
30
+ subject.class.should be_scope
31
+ subject.should == [ @published ]
32
+ end
33
+
34
+ it "should expand into array when using multiple parameters" do
35
+ subject = Post.conditions("published = ?", true)
36
+ subject.class.should be_scope
37
+ subject.should == [ @published ]
38
+ end
39
+
40
+ [:conditions, :order, :group, :having, :limit, :offset, :joins, :include, :select, :from].each do |option|
41
+ it "should known #{option} ActiveRecord::Base.find" do
42
+ Post.send(option).class.should be_scope
43
+ end
44
+ end
45
+
46
+ it "should default to true for readonly" do
47
+ subject = Post.readonly
48
+ subject.class.should be_scope
49
+ lambda { subject.first.save }.should raise_error(ActiveRecord::ReadOnlyRecord)
50
+ end
51
+
52
+ it "should accept a value for readonly" do
53
+ subject = Post.readonly(false)
54
+ subject.class.should be_scope
55
+ lambda { subject.first.save }.should_not raise_error(ActiveRecord::ReadOnlyRecord)
56
+ end
57
+
58
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'basic_named_scopes'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+ require 'active_record'
7
+ require 'temping'
8
+
9
+ Spec::Runner.configure do |config|
10
+ config.include(Temping)
11
+ end
12
+
13
+ def be_scope
14
+ eql(ActiveRecord::NamedScope::Scope)
15
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: basic_named_scopes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Iain Hecker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-19 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.9
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: temping
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.0
34
+ version:
35
+ description: Make your queries prettier and more reusable by having a named scope for every find-parameter. As easy as Post.include(:author, :comments)
36
+ email: iain@iain.nl
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.rdoc
43
+ files:
44
+ - .document
45
+ - .gitignore
46
+ - README.rdoc
47
+ - Rakefile
48
+ - VERSION
49
+ - lib/basic_named_scopes.rb
50
+ - spec/basic_named_scopes_spec.rb
51
+ - spec/spec.opts
52
+ - spec/spec_helper.rb
53
+ has_rdoc: true
54
+ homepage: http://github.com/iain/basic_named_scopes
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options:
59
+ - --charset=UTF-8
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ requirements: []
75
+
76
+ rubyforge_project:
77
+ rubygems_version: 1.3.5
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Basic named scopes for ActiveRecord makes all find-parameters a named scope
81
+ test_files:
82
+ - spec/basic_named_scopes_spec.rb
83
+ - spec/spec_helper.rb