in_place_relation 0.0.1 → 0.0.2

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,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in in_place_relation.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "in_place_relation/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "in_place_relation"
7
+ s.version = InPlaceRelation::VERSION
8
+ s.authors = ["Marek Janukowicz/Starware"]
9
+ s.email = ["marek@janukowicz.net"]
10
+ s.homepage = ""
11
+ s.summary = %q{A relation that can be changed in place}
12
+ s.description = %q{ActiveRecord::Relation wrapper that can be modified/combined in place}
13
+
14
+ #s.rubyforge_project = "in_place_relation"
15
+
16
+ s.files = `hg manifest`.split("\n")
17
+ s.test_files = `hg manifest | grep ^test`.split("\n")
18
+ s.executables = `hg manifest | grep ^bin`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "activerecord", ">= 3"
24
+ end
@@ -0,0 +1,3 @@
1
+ module InPlaceRelation
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,59 @@
1
+ require "in_place_relation/version"
2
+
3
+ # This module provides an in-place wrapper for ActiveRecord::Relation. So
4
+ # instead of doing this:
5
+ # rel = SomeModel.where( ... )
6
+ # rel = rel.joins().where() if x
7
+ # rel = rel.select() unless y
8
+ # rel.all
9
+ #
10
+ # you can do this
11
+ # rel = SomeModel.where( ... ).in_place
12
+ # rel.joins!().where!() if x
13
+ # rel.select!() unless y
14
+ # rel.all
15
+ module InPlaceRelation
16
+
17
+ module Methods
18
+
19
+ def in_place
20
+ return Wrapper.new( self )
21
+ end
22
+ end
23
+
24
+ class Wrapper
25
+
26
+ attr_reader :relation
27
+
28
+ METHODS_TO_WRAP = ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS + ActiveRecord::Relation::SINGLE_VALUE_METHODS
29
+
30
+ METHODS_TO_WRAP.each do |meth|
31
+ define_method( meth ) do |*args|
32
+ return @relation.send( meth, *args )
33
+ end
34
+
35
+ define_method( "#{meth}!" ) do |*args|
36
+ @relation = @relation.send( meth, *args )
37
+ return self
38
+ end
39
+ end
40
+
41
+ def initialize( relation )
42
+ @relation = relation
43
+ end
44
+
45
+ def inspect
46
+ return "#{self.class}:#{object_id}"
47
+ end
48
+
49
+ def method_missing( name, *args, &block )
50
+ @relation.send( name, *args, &block )
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ ActiveRecord::Associations::CollectionProxy.send( :include, InPlaceRelation::Methods )
58
+ ActiveRecord::Relation.send( :include, InPlaceRelation::Methods )
59
+ ActiveRecord::Base.send( :extend, InPlaceRelation::Methods )
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: in_place_relation
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Marek Janukowicz/Starware
@@ -41,8 +41,12 @@ extensions: []
41
41
 
42
42
  extra_rdoc_files: []
43
43
 
44
- files: []
45
-
44
+ files:
45
+ - Gemfile
46
+ - Rakefile
47
+ - in_place_relation.gemspec
48
+ - lib/in_place_relation.rb
49
+ - lib/in_place_relation/version.rb
46
50
  has_rdoc: true
47
51
  homepage: ""
48
52
  licenses: []